[vk] Simplifying DynamicState and ExtendedState with Bitfield
This commit is contained in:
@@ -61,37 +61,37 @@ void FixedPipelineState::Refresh(Tegra::Engines::Maxwell3D& maxwell3d, DynamicFe
|
||||
raw1_eds3_extended = 0;
|
||||
|
||||
// EDS1
|
||||
extended_dynamic_state.Assign(features.has_extended_dynamic_state ? 1 : 0);
|
||||
extended_dynamic_state.Assign(features.has_extended_dynamic_state);
|
||||
|
||||
// EDS2
|
||||
extended_dynamic_state_2.Assign(features.has_extended_dynamic_state_2 ? 1 : 0);
|
||||
extended_dynamic_state_2_logic_op.Assign(features.has_extended_dynamic_state_2_logic_op ? 1 : 0);
|
||||
extended_dynamic_state_2_patch_control_points.Assign(features.has_extended_dynamic_state_2_patch_control_points ? 1 : 0);
|
||||
extended_dynamic_state_2.Assign(features.has_extended_dynamic_state_2);
|
||||
extended_dynamic_state_2_logic_op.Assign(features.has_extended_dynamic_state_2_logic_op);
|
||||
extended_dynamic_state_2_patch_control_points.Assign(features.has_extended_dynamic_state_2_patch_control_points);
|
||||
|
||||
// EDS3 - Blending/Enables
|
||||
extended_dynamic_state_3_blend.Assign(features.has_extended_dynamic_state_3_blend ? 1 : 0);
|
||||
extended_dynamic_state_3_enables.Assign(features.has_extended_dynamic_state_3_enables ? 1 : 0);
|
||||
extended_dynamic_state_3_blend.Assign(features.has_extended_dynamic_state_3_blend);
|
||||
extended_dynamic_state_3_enables.Assign(features.has_extended_dynamic_state_3_enables);
|
||||
|
||||
// EDS3 - Granular features
|
||||
extended_dynamic_state_3_depth_clamp.Assign(features.has_extended_dynamic_state_3_depth_clamp ? 1 : 0);
|
||||
extended_dynamic_state_3_logic_op_enable.Assign(features.has_extended_dynamic_state_3_logic_op_enable ? 1 : 0);
|
||||
extended_dynamic_state_3_tessellation_domain_origin.Assign(features.has_extended_dynamic_state_3_tessellation_domain_origin ? 1 : 0);
|
||||
extended_dynamic_state_3_polygon_mode.Assign(features.has_extended_dynamic_state_3_polygon_mode ? 1 : 0);
|
||||
extended_dynamic_state_3_rasterization_samples.Assign(features.has_extended_dynamic_state_3_rasterization_samples ? 1 : 0);
|
||||
extended_dynamic_state_3_sample_mask.Assign(features.has_extended_dynamic_state_3_sample_mask ? 1 : 0);
|
||||
extended_dynamic_state_3_alpha_to_coverage_enable.Assign(features.has_extended_dynamic_state_3_alpha_to_coverage_enable ? 1 : 0);
|
||||
extended_dynamic_state_3_alpha_to_one_enable.Assign(features.has_extended_dynamic_state_3_alpha_to_one_enable ? 1 : 0);
|
||||
extended_dynamic_state_3_depth_clip_enable.Assign(features.has_extended_dynamic_state_3_depth_clip_enable ? 1 : 0);
|
||||
extended_dynamic_state_3_depth_clip_negative_one_to_one.Assign(features.has_extended_dynamic_state_3_depth_clip_negative_one_to_one ? 1 : 0);
|
||||
extended_dynamic_state_3_line_rasterization_mode.Assign(features.has_extended_dynamic_state_3_line_rasterization_mode ? 1 : 0);
|
||||
extended_dynamic_state_3_line_stipple_enable.Assign(features.has_extended_dynamic_state_3_line_stipple_enable ? 1 : 0);
|
||||
extended_dynamic_state_3_provoking_vertex_mode.Assign(features.has_extended_dynamic_state_3_provoking_vertex_mode ? 1 : 0);
|
||||
extended_dynamic_state_3_conservative_rasterization_mode.Assign(features.has_extended_dynamic_state_3_conservative_rasterization_mode ? 1 : 0);
|
||||
extended_dynamic_state_3_sample_locations_enable.Assign(features.has_extended_dynamic_state_3_sample_locations_enable ? 1 : 0);
|
||||
extended_dynamic_state_3_rasterization_stream.Assign(features.has_extended_dynamic_state_3_rasterization_stream ? 1 : 0);
|
||||
extended_dynamic_state_3_depth_clamp.Assign(features.has_extended_dynamic_state_3_depth_clamp);
|
||||
extended_dynamic_state_3_logic_op_enable.Assign(features.has_extended_dynamic_state_3_logic_op_enable);
|
||||
extended_dynamic_state_3_tessellation_domain_origin.Assign(features.has_extended_dynamic_state_3_tessellation_domain_origin);
|
||||
extended_dynamic_state_3_polygon_mode.Assign(features.has_extended_dynamic_state_3_polygon_mode);
|
||||
extended_dynamic_state_3_rasterization_samples.Assign(features.has_extended_dynamic_state_3_rasterization_samples);
|
||||
extended_dynamic_state_3_sample_mask.Assign(features.has_extended_dynamic_state_3_sample_mask);
|
||||
extended_dynamic_state_3_alpha_to_coverage_enable.Assign(features.has_extended_dynamic_state_3_alpha_to_coverage_enable);
|
||||
extended_dynamic_state_3_alpha_to_one_enable.Assign(features.has_extended_dynamic_state_3_alpha_to_one_enable);
|
||||
extended_dynamic_state_3_depth_clip_enable.Assign(features.has_extended_dynamic_state_3_depth_clip_enable);
|
||||
extended_dynamic_state_3_depth_clip_negative_one_to_one.Assign(features.has_extended_dynamic_state_3_depth_clip_negative_one_to_one);
|
||||
extended_dynamic_state_3_line_rasterization_mode.Assign(features.has_extended_dynamic_state_3_line_rasterization_mode);
|
||||
extended_dynamic_state_3_line_stipple_enable.Assign(features.has_extended_dynamic_state_3_line_stipple_enable);
|
||||
extended_dynamic_state_3_provoking_vertex_mode.Assign(features.has_extended_dynamic_state_3_provoking_vertex_mode);
|
||||
extended_dynamic_state_3_conservative_rasterization_mode.Assign(features.has_extended_dynamic_state_3_conservative_rasterization_mode);
|
||||
extended_dynamic_state_3_sample_locations_enable.Assign(features.has_extended_dynamic_state_3_sample_locations_enable);
|
||||
extended_dynamic_state_3_rasterization_stream.Assign(features.has_extended_dynamic_state_3_rasterization_stream);
|
||||
|
||||
// Vertex Input
|
||||
dynamic_vertex_input.Assign(features.has_dynamic_vertex_input ? 1 : 0);
|
||||
dynamic_vertex_input.Assign(features.has_dynamic_vertex_input);
|
||||
|
||||
xfb_enabled.Assign(regs.transform_feedback_enabled != 0);
|
||||
ndc_minus_one_to_one.Assign(regs.depth_mode == Maxwell::DepthMode::MinusOneToOne ? 1 : 0);
|
||||
@@ -187,7 +187,7 @@ void FixedPipelineState::Refresh(Tegra::Engines::Maxwell3D& maxwell3d, DynamicFe
|
||||
return static_cast<u16>(array.stride.Value());
|
||||
});
|
||||
}
|
||||
if (!extended_dynamic_state_2_extra) {
|
||||
if (!extended_dynamic_state_2_logic_op) {
|
||||
dynamic_state.Refresh2(regs, topology_, extended_dynamic_state_2);
|
||||
}
|
||||
if (!extended_dynamic_state_3_blend) {
|
||||
|
||||
@@ -18,37 +18,45 @@ namespace Vulkan {
|
||||
using Maxwell = Tegra::Engines::Maxwell3D::Regs;
|
||||
|
||||
struct DynamicFeatures {
|
||||
// VK_EXT_extended_dynamic_state (EDS1) - All-or-nothing
|
||||
bool has_extended_dynamic_state;
|
||||
|
||||
// VK_EXT_extended_dynamic_state2 (EDS2) - Granular features
|
||||
bool has_extended_dynamic_state_2; // Core EDS2 (RasterizerDiscard, DepthBias, PrimitiveRestart)
|
||||
bool has_extended_dynamic_state_2_logic_op; // LogicOp support
|
||||
bool has_extended_dynamic_state_2_patch_control_points; // TessellationPatchControlPoints
|
||||
|
||||
// VK_EXT_extended_dynamic_state3 (EDS3) - Highly granular features
|
||||
bool has_extended_dynamic_state_3_blend; // ColorBlendEnable + ColorBlendEquation + ColorWriteMask
|
||||
bool has_extended_dynamic_state_3_enables; // DepthClampEnable + LogicOpEnable
|
||||
bool has_extended_dynamic_state_3_depth_clamp; // DepthClampEnable only
|
||||
bool has_extended_dynamic_state_3_logic_op_enable; // LogicOpEnable only
|
||||
bool has_extended_dynamic_state_3_tessellation_domain_origin; // TessellationDomainOrigin
|
||||
bool has_extended_dynamic_state_3_polygon_mode; // PolygonMode
|
||||
bool has_extended_dynamic_state_3_rasterization_samples; // RasterizationSamples
|
||||
bool has_extended_dynamic_state_3_sample_mask; // SampleMask
|
||||
bool has_extended_dynamic_state_3_alpha_to_coverage_enable; // AlphaToCoverageEnable
|
||||
bool has_extended_dynamic_state_3_alpha_to_one_enable; // AlphaToOneEnable
|
||||
bool has_extended_dynamic_state_3_depth_clip_enable; // DepthClipEnable
|
||||
bool has_extended_dynamic_state_3_depth_clip_negative_one_to_one; // DepthClipNegativeOneToOne
|
||||
bool has_extended_dynamic_state_3_line_rasterization_mode; // LineRasterizationMode
|
||||
bool has_extended_dynamic_state_3_line_stipple_enable; // LineStippleEnable
|
||||
bool has_extended_dynamic_state_3_provoking_vertex_mode; // ProvokingVertexMode
|
||||
bool has_extended_dynamic_state_3_conservative_rasterization_mode; // ConservativeRasterizationMode
|
||||
bool has_extended_dynamic_state_3_sample_locations_enable; // SampleLocationsEnable
|
||||
bool has_extended_dynamic_state_3_rasterization_stream; // RasterizationStream
|
||||
|
||||
// VK_EXT_vertex_input_dynamic_state
|
||||
bool has_dynamic_vertex_input;
|
||||
union {
|
||||
u32 raw0;
|
||||
// VK_EXT_extended_dynamic_state (EDS1) - Bit 0
|
||||
BitField<0, 1, u32> has_extended_dynamic_state;
|
||||
|
||||
// VK_EXT_extended_dynamic_state2 (EDS2) - Bits 1-3
|
||||
BitField<1, 1, u32> has_extended_dynamic_state_2; // Core EDS2
|
||||
BitField<2, 1, u32> has_extended_dynamic_state_2_logic_op; // LogicOp
|
||||
BitField<3, 1, u32> has_extended_dynamic_state_2_patch_control_points; // Tessellation
|
||||
|
||||
// VK_EXT_extended_dynamic_state3 (EDS3) - Bits 4-5
|
||||
BitField<4, 1, u32> has_extended_dynamic_state_3_blend; // Blending composite
|
||||
BitField<5, 1, u32> has_extended_dynamic_state_3_enables; // Enables composite
|
||||
|
||||
// VK_EXT_vertex_input_dynamic_state - Bit 6
|
||||
BitField<6, 1, u32> has_dynamic_vertex_input;
|
||||
|
||||
// EDS3 Granular Features - Bits 7-15
|
||||
BitField<7, 1, u32> has_extended_dynamic_state_3_depth_clamp;
|
||||
BitField<8, 1, u32> has_extended_dynamic_state_3_logic_op_enable;
|
||||
BitField<9, 1, u32> has_extended_dynamic_state_3_tessellation_domain_origin;
|
||||
BitField<10, 1, u32> has_extended_dynamic_state_3_polygon_mode;
|
||||
BitField<11, 1, u32> has_extended_dynamic_state_3_rasterization_samples;
|
||||
BitField<12, 1, u32> has_extended_dynamic_state_3_sample_mask;
|
||||
BitField<13, 1, u32> has_extended_dynamic_state_3_alpha_to_coverage_enable;
|
||||
BitField<14, 1, u32> has_extended_dynamic_state_3_alpha_to_one_enable;
|
||||
BitField<15, 1, u32> has_extended_dynamic_state_3_depth_clip_enable;
|
||||
|
||||
// EDS3 Additional Features - Bits 16-22
|
||||
BitField<16, 1, u32> has_extended_dynamic_state_3_depth_clip_negative_one_to_one;
|
||||
BitField<17, 1, u32> has_extended_dynamic_state_3_line_rasterization_mode;
|
||||
BitField<18, 1, u32> has_extended_dynamic_state_3_line_stipple_enable;
|
||||
BitField<19, 1, u32> has_extended_dynamic_state_3_provoking_vertex_mode;
|
||||
BitField<20, 1, u32> has_extended_dynamic_state_3_conservative_rasterization_mode;
|
||||
BitField<21, 1, u32> has_extended_dynamic_state_3_sample_locations_enable;
|
||||
BitField<22, 1, u32> has_extended_dynamic_state_3_rasterization_stream;
|
||||
};
|
||||
};
|
||||
static_assert(std::has_unique_object_representations_v<DynamicFeatures>);
|
||||
|
||||
struct FixedPipelineState {
|
||||
static u32 PackComparisonOp(Maxwell::ComparisonOp op) noexcept;
|
||||
|
||||
@@ -424,39 +424,39 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_,
|
||||
|
||||
LOG_INFO(Render_Vulkan, "DynamicState value is set to {}", (u32) dynamic_state);
|
||||
|
||||
dynamic_features = DynamicFeatures{
|
||||
// EDS1 - All-or-nothing (enabled if driver supports AND setting > 0)
|
||||
.has_extended_dynamic_state = device.IsExtExtendedDynamicStateSupported() && dynamic_state > 0,
|
||||
|
||||
// EDS2 - Core features (enabled if driver supports AND setting > 1)
|
||||
.has_extended_dynamic_state_2 = device.IsExtExtendedDynamicState2Supported() && dynamic_state > 1,
|
||||
.has_extended_dynamic_state_2_logic_op = device.IsExtExtendedDynamicState2LogicOpSupported() && dynamic_state > 1,
|
||||
.has_extended_dynamic_state_2_patch_control_points = device.IsExtExtendedDynamicState2PatchControlPointsSupported() && dynamic_state > 1,
|
||||
|
||||
// EDS3 - Granular features (enabled if driver supports AND setting > 2)
|
||||
.has_extended_dynamic_state_3_blend = device.IsExtExtendedDynamicState3BlendingSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_enables = device.IsExtExtendedDynamicState3EnablesSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_depth_clamp = device.IsExtExtendedDynamicState3DepthClampEnableSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_logic_op_enable = device.IsExtExtendedDynamicState3LogicOpEnableSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_tessellation_domain_origin = device.IsExtExtendedDynamicState3TessellationDomainOriginSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_polygon_mode = device.IsExtExtendedDynamicState3PolygonModeSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_rasterization_samples = device.IsExtExtendedDynamicState3RasterizationSamplesSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_sample_mask = device.IsExtExtendedDynamicState3SampleMaskSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_alpha_to_coverage_enable = device.IsExtExtendedDynamicState3AlphaToCoverageEnableSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_alpha_to_one_enable = device.IsExtExtendedDynamicState3AlphaToOneEnableSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_depth_clip_enable = device.IsExtExtendedDynamicState3DepthClipEnableSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_depth_clip_negative_one_to_one = device.IsExtExtendedDynamicState3DepthClipNegativeOneToOneSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_line_rasterization_mode = device.IsExtExtendedDynamicState3LineRasterizationModeSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_line_stipple_enable = device.IsExtExtendedDynamicState3LineStippleEnableSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_provoking_vertex_mode = device.IsExtExtendedDynamicState3ProvokingVertexModeSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_conservative_rasterization_mode = device.IsExtExtendedDynamicState3ConservativeRasterizationModeSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_sample_locations_enable = device.IsExtExtendedDynamicState3SampleLocationsEnableSupported() && dynamic_state > 2,
|
||||
.has_extended_dynamic_state_3_rasterization_stream = device.IsExtExtendedDynamicState3RasterizationStreamSupported() && dynamic_state > 2,
|
||||
|
||||
// Vertex input dynamic state
|
||||
.has_dynamic_vertex_input = device.IsExtVertexInputDynamicStateSupported() &&
|
||||
Settings::values.vertex_input_dynamic_state.GetValue(),
|
||||
};
|
||||
dynamic_features.raw0 = 0;
|
||||
|
||||
// EDS1 - All-or-nothing (enabled if driver supports AND setting > 0)
|
||||
dynamic_features.has_extended_dynamic_state.Assign(device.IsExtExtendedDynamicStateSupported() && dynamic_state > 0);
|
||||
|
||||
// EDS2 - Core features (enabled if driver supports AND setting > 1)
|
||||
dynamic_features.has_extended_dynamic_state_2.Assign(device.IsExtExtendedDynamicState2Supported() && dynamic_state > 1);
|
||||
dynamic_features.has_extended_dynamic_state_2_logic_op.Assign(device.IsExtExtendedDynamicState2LogicOpSupported() && dynamic_state > 1);
|
||||
dynamic_features.has_extended_dynamic_state_2_patch_control_points.Assign(device.IsExtExtendedDynamicState2PatchControlPointsSupported() && dynamic_state > 1);
|
||||
|
||||
// EDS3 - Granular features (enabled if driver supports AND setting > 2)
|
||||
dynamic_features.has_extended_dynamic_state_3_blend.Assign(device.IsExtExtendedDynamicState3BlendingSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_enables.Assign(device.IsExtExtendedDynamicState3EnablesSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_depth_clamp.Assign(device.IsExtExtendedDynamicState3DepthClampEnableSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_logic_op_enable.Assign(device.IsExtExtendedDynamicState3LogicOpEnableSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_tessellation_domain_origin.Assign(device.IsExtExtendedDynamicState3TessellationDomainOriginSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_polygon_mode.Assign(device.IsExtExtendedDynamicState3PolygonModeSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_rasterization_samples.Assign(device.IsExtExtendedDynamicState3RasterizationSamplesSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_sample_mask.Assign(device.IsExtExtendedDynamicState3SampleMaskSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_alpha_to_coverage_enable.Assign(device.IsExtExtendedDynamicState3AlphaToCoverageEnableSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_alpha_to_one_enable.Assign(device.IsExtExtendedDynamicState3AlphaToOneEnableSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_depth_clip_enable.Assign(device.IsExtExtendedDynamicState3DepthClipEnableSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_depth_clip_negative_one_to_one.Assign(device.IsExtExtendedDynamicState3DepthClipNegativeOneToOneSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_line_rasterization_mode.Assign(device.IsExtExtendedDynamicState3LineRasterizationModeSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_line_stipple_enable.Assign(device.IsExtExtendedDynamicState3LineStippleEnableSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_provoking_vertex_mode.Assign(device.IsExtExtendedDynamicState3ProvokingVertexModeSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_conservative_rasterization_mode.Assign(device.IsExtExtendedDynamicState3ConservativeRasterizationModeSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_sample_locations_enable.Assign(device.IsExtExtendedDynamicState3SampleLocationsEnableSupported() && dynamic_state > 2);
|
||||
dynamic_features.has_extended_dynamic_state_3_rasterization_stream.Assign(device.IsExtExtendedDynamicState3RasterizationStreamSupported() && dynamic_state > 2);
|
||||
|
||||
// Vertex input dynamic state (independent toggle)
|
||||
dynamic_features.has_dynamic_vertex_input.Assign(device.IsExtVertexInputDynamicStateSupported() &&
|
||||
Settings::values.vertex_input_dynamic_state.GetValue());
|
||||
}
|
||||
|
||||
PipelineCache::~PipelineCache() {
|
||||
|
||||
Reference in New Issue
Block a user