forked from suyu/suyu
vk_graphics_pipeline: Implement line width
This commit is contained in:
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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue