Skip to content

Commit

Permalink
[dxvk] Enable and use dynamic viewport and scissor rect count
Browse files Browse the repository at this point in the history
  • Loading branch information
doitsujin committed Jul 7, 2022
1 parent b34421b commit 4b82a05
Show file tree
Hide file tree
Showing 7 changed files with 29 additions and 37 deletions.
18 changes: 8 additions & 10 deletions src/dxvk/dxvk_cmdlist.h
Original file line number Diff line number Diff line change
Expand Up @@ -707,14 +707,13 @@ namespace dxvk {


void cmdSetScissor(
uint32_t firstScissor,
uint32_t scissorCount,
const VkRect2D* scissors) {
m_vkd->vkCmdSetScissor(m_execBuffer,
firstScissor, scissorCount, scissors);
m_vkd->vkCmdSetScissorWithCountEXT(
m_execBuffer, scissorCount, scissors);
}


void cmdSetStencilReference(
VkStencilFaceFlags faceMask,
uint32_t reference) {
Expand All @@ -724,14 +723,13 @@ namespace dxvk {


void cmdSetViewport(
uint32_t firstViewport,
uint32_t viewportCount,
const VkViewport* viewports) {
m_vkd->vkCmdSetViewport(m_execBuffer,
firstViewport, viewportCount, viewports);
m_vkd->vkCmdSetViewportWithCountEXT(
m_execBuffer, viewportCount, viewports);
}


void cmdWriteTimestamp(
VkPipelineStageFlagBits pipelineStage,
VkQueryPool queryPool,
Expand Down
29 changes: 12 additions & 17 deletions src/dxvk/dxvk_context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1661,8 +1661,8 @@ namespace dxvk {
m_cmd->cmdBindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS,
pipeInfo.pipeLayout, descriptorWrite.dstSet, 0, nullptr);

m_cmd->cmdSetViewport(0, 1, &viewport);
m_cmd->cmdSetScissor (0, 1, &scissor);
m_cmd->cmdSetViewport(1, &viewport);
m_cmd->cmdSetScissor(1, &scissor);

m_cmd->cmdPushConstants(
pipeInfo.pipeLayout,
Expand Down Expand Up @@ -2290,13 +2290,8 @@ namespace dxvk {
uint32_t viewportCount,
const VkViewport* viewports,
const VkRect2D* scissorRects) {
if (m_state.gp.state.rs.viewportCount() != viewportCount) {
m_state.gp.state.rs.setViewportCount(viewportCount);
m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
}

for (uint32_t i = 0; i < viewportCount; i++) {
m_state.vp.viewports[i] = viewports[i];
m_state.vp.viewports[i] = viewports[i];
m_state.vp.scissorRects[i] = scissorRects[i];

// Vulkan viewports are not allowed to have a width or
Expand All @@ -2311,6 +2306,7 @@ namespace dxvk {
}
}

m_state.vp.viewportCount = viewportCount;
m_flags.set(DxvkContextFlag::GpDirtyViewport);
}

Expand Down Expand Up @@ -2711,8 +2707,8 @@ namespace dxvk {
scissor.offset = { dstOffsets[0].x, dstOffsets[0].y };
scissor.extent = { dstExtent.width, dstExtent.height };

m_cmd->cmdSetViewport(0, 1, &viewport);
m_cmd->cmdSetScissor (0, 1, &scissor);
m_cmd->cmdSetViewport(1, &viewport);
m_cmd->cmdSetScissor(1, &scissor);

// Bind source image view
VkDescriptorImageInfo descriptorImage;
Expand Down Expand Up @@ -3508,8 +3504,8 @@ namespace dxvk {
m_cmd->cmdBindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS,
pipeInfo.pipeLayout, descriptorSet, 0, nullptr);

m_cmd->cmdSetViewport(0, 1, &viewport);
m_cmd->cmdSetScissor (0, 1, &scissor);
m_cmd->cmdSetViewport(1, &viewport);
m_cmd->cmdSetScissor(1, &scissor);

VkOffset2D srcCoordOffset = {
srcOffset.x - dstOffset.x,
Expand Down Expand Up @@ -3941,8 +3937,8 @@ namespace dxvk {
m_cmd->cmdBindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeInfo.pipeHandle);
m_cmd->cmdBindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS,
pipeInfo.pipeLayout, descriptorSet, 0, nullptr);
m_cmd->cmdSetViewport(0, 1, &viewport);
m_cmd->cmdSetScissor (0, 1, &scissor);
m_cmd->cmdSetViewport(1, &viewport);
m_cmd->cmdSetScissor(1, &scissor);
m_cmd->cmdPushConstants(pipeInfo.pipeLayout,
VK_SHADER_STAGE_FRAGMENT_BIT,
0, sizeof(srcOffset), &srcOffset);
Expand Down Expand Up @@ -5037,9 +5033,8 @@ namespace dxvk {
if (m_flags.test(DxvkContextFlag::GpDirtyViewport)) {
m_flags.clr(DxvkContextFlag::GpDirtyViewport);

uint32_t viewportCount = m_state.gp.state.rs.viewportCount();
m_cmd->cmdSetViewport(0, viewportCount, m_state.vp.viewports.data());
m_cmd->cmdSetScissor (0, viewportCount, m_state.vp.scissorRects.data());
m_cmd->cmdSetViewport(m_state.vp.viewportCount, m_state.vp.viewports.data());
m_cmd->cmdSetScissor(m_state.vp.viewportCount, m_state.vp.scissorRects.data());
}

if (m_flags.all(DxvkContextFlag::GpDirtyBlendConstants,
Expand Down
1 change: 1 addition & 0 deletions src/dxvk/dxvk_context_state.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ namespace dxvk {


struct DxvkViewportState {
uint32_t viewportCount = 0;
std::array<VkViewport, DxvkLimits::MaxNumViewports> viewports = { };
std::array<VkRect2D, DxvkLimits::MaxNumViewports> scissorRects = { };
};
Expand Down
6 changes: 2 additions & 4 deletions src/dxvk/dxvk_graphics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,8 @@ namespace dxvk {
std::array<VkDynamicState, 6> dynamicStates;
uint32_t dynamicStateCount = 0;

dynamicStates[dynamicStateCount++] = VK_DYNAMIC_STATE_VIEWPORT;
dynamicStates[dynamicStateCount++] = VK_DYNAMIC_STATE_SCISSOR;
dynamicStates[dynamicStateCount++] = VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT;
dynamicStates[dynamicStateCount++] = VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT;

if (state.useDynamicDepthBias())
dynamicStates[dynamicStateCount++] = VK_DYNAMIC_STATE_DEPTH_BIAS;
Expand Down Expand Up @@ -270,8 +270,6 @@ namespace dxvk {
tsInfo.patchControlPoints = state.ia.patchVertexCount();

VkPipelineViewportStateCreateInfo vpInfo = { VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO };
vpInfo.viewportCount = state.rs.viewportCount();
vpInfo.scissorCount = state.rs.viewportCount();

VkPipelineRasterizationConservativeStateCreateInfoEXT conservativeInfo = { VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT };
conservativeInfo.conservativeRasterizationMode = state.rs.conservativeMode();
Expand Down
4 changes: 2 additions & 2 deletions src/dxvk/dxvk_meta_blit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -307,8 +307,8 @@ namespace dxvk {
VK_SHADER_STAGE_FRAGMENT_BIT, psModule, "main" };

std::array<VkDynamicState, 2> dynStates = {{
VK_DYNAMIC_STATE_VIEWPORT,
VK_DYNAMIC_STATE_SCISSOR,
VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT,
VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT,
}};

VkPipelineDynamicStateCreateInfo dynState = { VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO };
Expand Down
4 changes: 2 additions & 2 deletions src/dxvk/dxvk_meta_copy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -344,8 +344,8 @@ namespace dxvk {
VK_SHADER_STAGE_FRAGMENT_BIT, psModule, "main" };

std::array<VkDynamicState, 2> dynStates = {{
VK_DYNAMIC_STATE_VIEWPORT,
VK_DYNAMIC_STATE_SCISSOR,
VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT,
VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT,
}};

VkPipelineDynamicStateCreateInfo dynState = { VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO };
Expand Down
4 changes: 2 additions & 2 deletions src/dxvk/dxvk_meta_resolve.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,8 @@ namespace dxvk {
VK_SHADER_STAGE_FRAGMENT_BIT, psModule, "main", &specInfo };

std::array<VkDynamicState, 2> dynStates = {{
VK_DYNAMIC_STATE_VIEWPORT,
VK_DYNAMIC_STATE_SCISSOR,
VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT,
VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT,
}};

VkPipelineDynamicStateCreateInfo dynState = { VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO };
Expand Down

0 comments on commit 4b82a05

Please sign in to comment.