vk_graphics_pipeline: Implement line width

master
ReinUsesLisp 2021-06-25 05:21:51 +07:00 committed by ameerj
parent 5b2b0634a1
commit 57a8921e01
8 changed files with 36 additions and 8 deletions

@ -705,11 +705,12 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) {
.pAttachments = cb_attachments.data(), .pAttachments = cb_attachments.data(),
.blendConstants = {}, .blendConstants = {},
}; };
static_vector<VkDynamicState, 18> dynamic_states{ static_vector<VkDynamicState, 19> dynamic_states{
VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR,
VK_DYNAMIC_STATE_DEPTH_BIAS, VK_DYNAMIC_STATE_BLEND_CONSTANTS, VK_DYNAMIC_STATE_DEPTH_BIAS, VK_DYNAMIC_STATE_BLEND_CONSTANTS,
VK_DYNAMIC_STATE_DEPTH_BOUNDS, VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK, VK_DYNAMIC_STATE_DEPTH_BOUNDS, VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,
VK_DYNAMIC_STATE_STENCIL_WRITE_MASK, VK_DYNAMIC_STATE_STENCIL_REFERENCE, VK_DYNAMIC_STATE_STENCIL_WRITE_MASK, VK_DYNAMIC_STATE_STENCIL_REFERENCE,
VK_DYNAMIC_STATE_LINE_WIDTH,
}; };
if (key.state.extended_dynamic_state) { if (key.state.extended_dynamic_state) {
static constexpr std::array extended{ static constexpr std::array extended{

@ -541,6 +541,7 @@ void RasterizerVulkan::UpdateDynamicStates() {
UpdateBlendConstants(regs); UpdateBlendConstants(regs);
UpdateDepthBounds(regs); UpdateDepthBounds(regs);
UpdateStencilFaces(regs); UpdateStencilFaces(regs);
UpdateLineWidth(regs);
if (device.IsExtExtendedDynamicStateSupported()) { if (device.IsExtExtendedDynamicStateSupported()) {
UpdateCullMode(regs); UpdateCullMode(regs);
UpdateDepthBoundsTestEnable(regs); UpdateDepthBoundsTestEnable(regs);
@ -676,6 +677,14 @@ void RasterizerVulkan::UpdateStencilFaces(Tegra::Engines::Maxwell3D::Regs& regs)
} }
} }
void RasterizerVulkan::UpdateLineWidth(Tegra::Engines::Maxwell3D::Regs& regs) {
if (!state_tracker.TouchLineWidth()) {
return;
}
const float width = regs.line_smooth_enable ? regs.line_width_smooth : regs.line_width_aliased;
scheduler.Record([width](vk::CommandBuffer cmdbuf) { cmdbuf.SetLineWidth(width); });
}
void RasterizerVulkan::UpdateCullMode(Tegra::Engines::Maxwell3D::Regs& regs) { void RasterizerVulkan::UpdateCullMode(Tegra::Engines::Maxwell3D::Regs& regs) {
if (!state_tracker.TouchCullMode()) { if (!state_tracker.TouchCullMode()) {
return; return;

@ -125,6 +125,7 @@ private:
void UpdateBlendConstants(Tegra::Engines::Maxwell3D::Regs& regs); void UpdateBlendConstants(Tegra::Engines::Maxwell3D::Regs& regs);
void UpdateDepthBounds(Tegra::Engines::Maxwell3D::Regs& regs); void UpdateDepthBounds(Tegra::Engines::Maxwell3D::Regs& regs);
void UpdateStencilFaces(Tegra::Engines::Maxwell3D::Regs& regs); void UpdateStencilFaces(Tegra::Engines::Maxwell3D::Regs& regs);
void UpdateLineWidth(Tegra::Engines::Maxwell3D::Regs& regs);
void UpdateCullMode(Tegra::Engines::Maxwell3D::Regs& regs); void UpdateCullMode(Tegra::Engines::Maxwell3D::Regs& regs);
void UpdateDepthBoundsTestEnable(Tegra::Engines::Maxwell3D::Regs& regs); void UpdateDepthBoundsTestEnable(Tegra::Engines::Maxwell3D::Regs& regs);

@ -29,10 +29,10 @@ using Flags = Maxwell3D::DirtyState::Flags;
Flags MakeInvalidationFlags() { Flags MakeInvalidationFlags() {
static constexpr int INVALIDATION_FLAGS[]{ static constexpr int INVALIDATION_FLAGS[]{
Viewports, Scissors, DepthBias, BlendConstants, Viewports, Scissors, DepthBias, BlendConstants, DepthBounds,
DepthBounds, StencilProperties, CullMode, DepthBoundsEnable, StencilProperties, LineWidth, CullMode, DepthBoundsEnable, DepthTestEnable,
DepthTestEnable, DepthWriteEnable, DepthCompareOp, FrontFace, DepthWriteEnable, DepthCompareOp, FrontFace, StencilOp, StencilTestEnable,
StencilOp, StencilTestEnable, VertexBuffers, VertexInput, VertexBuffers, VertexInput,
}; };
Flags flags{}; Flags flags{};
for (const int flag : INVALIDATION_FLAGS) { for (const int flag : INVALIDATION_FLAGS) {
@ -86,6 +86,11 @@ void SetupDirtyStencilProperties(Tables& tables) {
table[OFF(stencil_back_func_mask)] = StencilProperties; table[OFF(stencil_back_func_mask)] = StencilProperties;
} }
void SetupDirtyLineWidth(Tables& tables) {
tables[0][OFF(line_width_smooth)] = LineWidth;
tables[0][OFF(line_width_aliased)] = LineWidth;
}
void SetupDirtyCullMode(Tables& tables) { void SetupDirtyCullMode(Tables& tables) {
auto& table = tables[0]; auto& table = tables[0];
table[OFF(cull_face)] = CullMode; table[OFF(cull_face)] = CullMode;
@ -180,6 +185,7 @@ StateTracker::StateTracker(Tegra::GPU& gpu)
SetupDirtyBlendConstants(tables); SetupDirtyBlendConstants(tables);
SetupDirtyDepthBounds(tables); SetupDirtyDepthBounds(tables);
SetupDirtyStencilProperties(tables); SetupDirtyStencilProperties(tables);
SetupDirtyLineWidth(tables);
SetupDirtyCullMode(tables); SetupDirtyCullMode(tables);
SetupDirtyDepthBoundsEnable(tables); SetupDirtyDepthBoundsEnable(tables);
SetupDirtyDepthTestEnable(tables); SetupDirtyDepthTestEnable(tables);

@ -31,6 +31,7 @@ enum : u8 {
BlendConstants, BlendConstants,
DepthBounds, DepthBounds,
StencilProperties, StencilProperties,
LineWidth,
CullMode, CullMode,
DepthBoundsEnable, DepthBoundsEnable,
@ -44,7 +45,7 @@ enum : u8 {
Blending, Blending,
ViewportSwizzles, ViewportSwizzles,
Last Last,
}; };
static_assert(Last <= std::numeric_limits<u8>::max()); static_assert(Last <= std::numeric_limits<u8>::max());
@ -93,6 +94,10 @@ public:
return Exchange(Dirty::StencilProperties, false); return Exchange(Dirty::StencilProperties, false);
} }
bool TouchLineWidth() const {
return Exchange(Dirty::LineWidth, false);
}
bool TouchCullMode() { bool TouchCullMode() {
return Exchange(Dirty::CullMode, false); return Exchange(Dirty::CullMode, false);
} }

@ -227,7 +227,7 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
.depthBiasClamp = true, .depthBiasClamp = true,
.fillModeNonSolid = true, .fillModeNonSolid = true,
.depthBounds = is_depth_bounds_supported, .depthBounds = is_depth_bounds_supported,
.wideLines = false, .wideLines = true,
.largePoints = true, .largePoints = true,
.alphaToOne = false, .alphaToOne = false,
.multiViewport = true, .multiViewport = true,
@ -703,7 +703,6 @@ void Device::CheckSuitability(bool requires_swapchain) const {
const std::array feature_report{ const std::array feature_report{
std::make_pair(features.robustBufferAccess, "robustBufferAccess"), std::make_pair(features.robustBufferAccess, "robustBufferAccess"),
std::make_pair(features.vertexPipelineStoresAndAtomics, "vertexPipelineStoresAndAtomics"), std::make_pair(features.vertexPipelineStoresAndAtomics, "vertexPipelineStoresAndAtomics"),
std::make_pair(features.robustBufferAccess, "robustBufferAccess"),
std::make_pair(features.imageCubeArray, "imageCubeArray"), std::make_pair(features.imageCubeArray, "imageCubeArray"),
std::make_pair(features.independentBlend, "independentBlend"), std::make_pair(features.independentBlend, "independentBlend"),
std::make_pair(features.depthClamp, "depthClamp"), std::make_pair(features.depthClamp, "depthClamp"),
@ -712,6 +711,7 @@ void Device::CheckSuitability(bool requires_swapchain) const {
std::make_pair(features.multiViewport, "multiViewport"), std::make_pair(features.multiViewport, "multiViewport"),
std::make_pair(features.depthBiasClamp, "depthBiasClamp"), std::make_pair(features.depthBiasClamp, "depthBiasClamp"),
std::make_pair(features.fillModeNonSolid, "fillModeNonSolid"), std::make_pair(features.fillModeNonSolid, "fillModeNonSolid"),
std::make_pair(features.wideLines, "wideLines"),
std::make_pair(features.geometryShader, "geometryShader"), std::make_pair(features.geometryShader, "geometryShader"),
std::make_pair(features.tessellationShader, "tessellationShader"), std::make_pair(features.tessellationShader, "tessellationShader"),
std::make_pair(features.sampleRateShading, "sampleRateShading"), std::make_pair(features.sampleRateShading, "sampleRateShading"),

@ -121,6 +121,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept {
X(vkCmdSetDepthTestEnableEXT); X(vkCmdSetDepthTestEnableEXT);
X(vkCmdSetDepthWriteEnableEXT); X(vkCmdSetDepthWriteEnableEXT);
X(vkCmdSetFrontFaceEXT); X(vkCmdSetFrontFaceEXT);
X(vkCmdSetLineWidth);
X(vkCmdSetPrimitiveTopologyEXT); X(vkCmdSetPrimitiveTopologyEXT);
X(vkCmdSetStencilOpEXT); X(vkCmdSetStencilOpEXT);
X(vkCmdSetStencilTestEnableEXT); X(vkCmdSetStencilTestEnableEXT);

@ -231,6 +231,7 @@ struct DeviceDispatch : InstanceDispatch {
PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT{}; PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT{};
PFN_vkCmdSetEvent vkCmdSetEvent{}; PFN_vkCmdSetEvent vkCmdSetEvent{};
PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT{}; PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT{};
PFN_vkCmdSetLineWidth vkCmdSetLineWidth{};
PFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT{}; PFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT{};
PFN_vkCmdSetScissor vkCmdSetScissor{}; PFN_vkCmdSetScissor vkCmdSetScissor{};
PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask{}; PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask{};
@ -1198,6 +1199,10 @@ public:
dld->vkCmdSetFrontFaceEXT(handle, front_face); dld->vkCmdSetFrontFaceEXT(handle, front_face);
} }
void SetLineWidth(float line_width) const noexcept {
dld->vkCmdSetLineWidth(handle, line_width);
}
void SetPrimitiveTopologyEXT(VkPrimitiveTopology primitive_topology) const noexcept { void SetPrimitiveTopologyEXT(VkPrimitiveTopology primitive_topology) const noexcept {
dld->vkCmdSetPrimitiveTopologyEXT(handle, primitive_topology); dld->vkCmdSetPrimitiveTopologyEXT(handle, primitive_topology);
} }