renderer_vulkan: Respect viewport limit
This commit is contained in:
parent
a9b44d37e1
commit
c339af37a7
|
@ -652,13 +652,14 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) {
|
||||||
.pNext = nullptr,
|
.pNext = nullptr,
|
||||||
.negativeOneToOne = key.state.ndc_minus_one_to_one.Value() != 0 ? VK_TRUE : VK_FALSE,
|
.negativeOneToOne = key.state.ndc_minus_one_to_one.Value() != 0 ? VK_TRUE : VK_FALSE,
|
||||||
};
|
};
|
||||||
|
const u32 num_viewports = std::min<u32>(device.GetMaxViewports(), Maxwell::NumViewports);
|
||||||
VkPipelineViewportStateCreateInfo viewport_ci{
|
VkPipelineViewportStateCreateInfo viewport_ci{
|
||||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
|
||||||
.pNext = nullptr,
|
.pNext = nullptr,
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.viewportCount = Maxwell::NumViewports,
|
.viewportCount = num_viewports,
|
||||||
.pViewports = nullptr,
|
.pViewports = nullptr,
|
||||||
.scissorCount = Maxwell::NumViewports,
|
.scissorCount = num_viewports,
|
||||||
.pScissors = nullptr,
|
.pScissors = nullptr,
|
||||||
};
|
};
|
||||||
if (device.IsNvViewportSwizzleSupported()) {
|
if (device.IsNvViewportSwizzleSupported()) {
|
||||||
|
|
|
@ -925,7 +925,7 @@ void RasterizerVulkan::UpdateViewportsState(Tegra::Engines::Maxwell3D::Regs& reg
|
||||||
}
|
}
|
||||||
const bool is_rescaling{texture_cache.IsRescaling()};
|
const bool is_rescaling{texture_cache.IsRescaling()};
|
||||||
const float scale = is_rescaling ? Settings::values.resolution_info.up_factor : 1.0f;
|
const float scale = is_rescaling ? Settings::values.resolution_info.up_factor : 1.0f;
|
||||||
const std::array viewports{
|
const std::array viewport_list{
|
||||||
GetViewportState(device, regs, 0, scale), GetViewportState(device, regs, 1, scale),
|
GetViewportState(device, regs, 0, scale), GetViewportState(device, regs, 1, scale),
|
||||||
GetViewportState(device, regs, 2, scale), GetViewportState(device, regs, 3, scale),
|
GetViewportState(device, regs, 2, scale), GetViewportState(device, regs, 3, scale),
|
||||||
GetViewportState(device, regs, 4, scale), GetViewportState(device, regs, 5, scale),
|
GetViewportState(device, regs, 4, scale), GetViewportState(device, regs, 5, scale),
|
||||||
|
@ -935,7 +935,11 @@ void RasterizerVulkan::UpdateViewportsState(Tegra::Engines::Maxwell3D::Regs& reg
|
||||||
GetViewportState(device, regs, 12, scale), GetViewportState(device, regs, 13, scale),
|
GetViewportState(device, regs, 12, scale), GetViewportState(device, regs, 13, scale),
|
||||||
GetViewportState(device, regs, 14, scale), GetViewportState(device, regs, 15, scale),
|
GetViewportState(device, regs, 14, scale), GetViewportState(device, regs, 15, scale),
|
||||||
};
|
};
|
||||||
scheduler.Record([viewports](vk::CommandBuffer cmdbuf) { cmdbuf.SetViewport(0, viewports); });
|
scheduler.Record([this, viewport_list](vk::CommandBuffer cmdbuf) {
|
||||||
|
const u32 num_viewports = std::min<u32>(device.GetMaxViewports(), Maxwell::NumViewports);
|
||||||
|
const vk::Span<VkViewport> viewports(viewport_list.data(), num_viewports);
|
||||||
|
cmdbuf.SetViewport(0, viewports);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D::Regs& regs) {
|
void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D::Regs& regs) {
|
||||||
|
@ -948,7 +952,7 @@ void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D::Regs& regs
|
||||||
up_scale = Settings::values.resolution_info.up_scale;
|
up_scale = Settings::values.resolution_info.up_scale;
|
||||||
down_shift = Settings::values.resolution_info.down_shift;
|
down_shift = Settings::values.resolution_info.down_shift;
|
||||||
}
|
}
|
||||||
const std::array scissors{
|
const std::array scissor_list{
|
||||||
GetScissorState(regs, 0, up_scale, down_shift),
|
GetScissorState(regs, 0, up_scale, down_shift),
|
||||||
GetScissorState(regs, 1, up_scale, down_shift),
|
GetScissorState(regs, 1, up_scale, down_shift),
|
||||||
GetScissorState(regs, 2, up_scale, down_shift),
|
GetScissorState(regs, 2, up_scale, down_shift),
|
||||||
|
@ -966,7 +970,11 @@ void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D::Regs& regs
|
||||||
GetScissorState(regs, 14, up_scale, down_shift),
|
GetScissorState(regs, 14, up_scale, down_shift),
|
||||||
GetScissorState(regs, 15, up_scale, down_shift),
|
GetScissorState(regs, 15, up_scale, down_shift),
|
||||||
};
|
};
|
||||||
scheduler.Record([scissors](vk::CommandBuffer cmdbuf) { cmdbuf.SetScissor(0, scissors); });
|
scheduler.Record([this, scissor_list](vk::CommandBuffer cmdbuf) {
|
||||||
|
const u32 num_scissors = std::min<u32>(device.GetMaxViewports(), Maxwell::NumViewports);
|
||||||
|
const vk::Span<VkRect2D> scissors(scissor_list.data(), num_scissors);
|
||||||
|
cmdbuf.SetScissor(0, scissors);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D::Regs& regs) {
|
void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D::Regs& regs) {
|
||||||
|
|
|
@ -588,6 +588,10 @@ public:
|
||||||
return properties.properties.limits.maxVertexInputBindings;
|
return properties.properties.limits.maxVertexInputBindings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 GetMaxViewports() const {
|
||||||
|
return properties.properties.limits.maxViewports;
|
||||||
|
}
|
||||||
|
|
||||||
bool SupportsConditionalBarriers() const {
|
bool SupportsConditionalBarriers() const {
|
||||||
return supports_conditional_barriers;
|
return supports_conditional_barriers;
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue