Browse Source

[vulkan] Removal of dynamic viewport/scissor

vkexperiments1
CamilleLaVey 6 days ago
parent
commit
e98280bee9
  1. 11
      src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
  2. 46
      src/video_core/renderer_vulkan/vk_rasterizer.cpp

11
src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp

@ -692,9 +692,9 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) {
.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 = key.state.extended_dynamic_state ? 0u : num_viewports,
.viewportCount = num_viewports,
.pViewports = nullptr, .pViewports = nullptr,
.scissorCount = key.state.extended_dynamic_state ? 0u : num_viewports,
.scissorCount = num_viewports,
.pScissors = nullptr, .pScissors = nullptr,
}; };
if (device.IsNvViewportSwizzleSupported()) { if (device.IsNvViewportSwizzleSupported()) {
@ -906,8 +906,6 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) {
} }
if (key.state.extended_dynamic_state) { if (key.state.extended_dynamic_state) {
static constexpr std::array extended{ static constexpr std::array extended{
VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT,
VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT,
VK_DYNAMIC_STATE_CULL_MODE_EXT, VK_DYNAMIC_STATE_CULL_MODE_EXT,
VK_DYNAMIC_STATE_FRONT_FACE_EXT, VK_DYNAMIC_STATE_FRONT_FACE_EXT,
VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT, VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT,
@ -923,6 +921,11 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) {
dynamic_states.push_back(VK_DYNAMIC_STATE_SCISSOR); dynamic_states.push_back(VK_DYNAMIC_STATE_SCISSOR);
} }
if (key.state.extended_dynamic_state) {
dynamic_states.push_back(VK_DYNAMIC_STATE_VIEWPORT);
dynamic_states.push_back(VK_DYNAMIC_STATE_SCISSOR);
}
// EDS2 - Core (3 states) // EDS2 - Core (3 states)
if (key.state.extended_dynamic_state_2) { if (key.state.extended_dynamic_state_2) {
static constexpr std::array extended2{ static constexpr std::array extended2{

46
src/video_core/renderer_vulkan/vk_rasterizer.cpp

@ -1159,16 +1159,8 @@ void RasterizerVulkan::UpdateViewportsState(Tegra::Engines::Maxwell3D::Regs& reg
.minDepth = 0.0f, .minDepth = 0.0f,
.maxDepth = 1.0f, .maxDepth = 1.0f,
}; };
GraphicsPipeline* pipeline = pipeline_cache.CurrentGraphicsPipeline();
const bool use_viewport_with_count = device.IsExtExtendedDynamicStateSupported() &&
(!pipeline || pipeline->UsesExtendedDynamicState());
scheduler.Record([viewport, use_viewport_with_count](vk::CommandBuffer cmdbuf) {
if (use_viewport_with_count) {
std::array viewports{viewport};
cmdbuf.SetViewportWithCountEXT(viewports);
} else {
cmdbuf.SetViewport(0, viewport);
}
scheduler.Record([viewport](vk::CommandBuffer cmdbuf) {
cmdbuf.SetViewport(0, viewport);
}); });
return; return;
} }
@ -1184,17 +1176,10 @@ 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),
}; };
GraphicsPipeline* pipeline = pipeline_cache.CurrentGraphicsPipeline();
const bool use_viewport_with_count = device.IsExtExtendedDynamicStateSupported() &&
(!pipeline || pipeline->UsesExtendedDynamicState());
scheduler.Record([this, viewport_list, use_viewport_with_count](vk::CommandBuffer cmdbuf) {
scheduler.Record([this, viewport_list](vk::CommandBuffer cmdbuf) {
const u32 num_viewports = std::min<u32>(device.GetMaxViewports(), Maxwell::NumViewports); const u32 num_viewports = std::min<u32>(device.GetMaxViewports(), Maxwell::NumViewports);
const vk::Span<VkViewport> viewports(viewport_list.data(), num_viewports); const vk::Span<VkViewport> viewports(viewport_list.data(), num_viewports);
if (use_viewport_with_count) {
cmdbuf.SetViewportWithCountEXT(viewports);
} else {
cmdbuf.SetViewport(0, viewports);
}
cmdbuf.SetViewport(0, viewports);
}); });
} }
@ -1215,16 +1200,8 @@ void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D::Regs& regs
scissor.offset.y = static_cast<int32_t>(y); scissor.offset.y = static_cast<int32_t>(y);
scissor.extent.width = width; scissor.extent.width = width;
scissor.extent.height = height; scissor.extent.height = height;
GraphicsPipeline* pipeline = pipeline_cache.CurrentGraphicsPipeline();
const bool use_scissor_with_count = device.IsExtExtendedDynamicStateSupported() &&
(!pipeline || pipeline->UsesExtendedDynamicState());
scheduler.Record([scissor, use_scissor_with_count](vk::CommandBuffer cmdbuf) {
if (use_scissor_with_count) {
std::array scissors{scissor};
cmdbuf.SetScissorWithCountEXT(scissors);
} else {
cmdbuf.SetScissor(0, scissor);
}
scheduler.Record([scissor](vk::CommandBuffer cmdbuf) {
cmdbuf.SetScissor(0, scissor);
}); });
return; return;
} }
@ -1252,17 +1229,10 @@ 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),
}; };
GraphicsPipeline* pipeline = pipeline_cache.CurrentGraphicsPipeline();
const bool use_scissor_with_count = device.IsExtExtendedDynamicStateSupported() &&
(!pipeline || pipeline->UsesExtendedDynamicState());
scheduler.Record([this, scissor_list, use_scissor_with_count](vk::CommandBuffer cmdbuf) {
scheduler.Record([this, scissor_list](vk::CommandBuffer cmdbuf) {
const u32 num_scissors = std::min<u32>(device.GetMaxViewports(), Maxwell::NumViewports); const u32 num_scissors = std::min<u32>(device.GetMaxViewports(), Maxwell::NumViewports);
const vk::Span<VkRect2D> scissors(scissor_list.data(), num_scissors); const vk::Span<VkRect2D> scissors(scissor_list.data(), num_scissors);
if (use_scissor_with_count) {
cmdbuf.SetScissorWithCountEXT(scissors);
} else {
cmdbuf.SetScissor(0, scissors);
}
cmdbuf.SetScissor(0, scissors);
}); });
} }

Loading…
Cancel
Save