1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-14 22:29:15 +01:00

[dxvk] Use packed rasterizer state

This commit is contained in:
Philip Rebohle 2019-10-07 12:41:18 +02:00
parent a5ab88d8f2
commit 09c813c934
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 98 additions and 28 deletions

View File

@ -2173,8 +2173,8 @@ namespace dxvk {
uint32_t viewportCount, uint32_t viewportCount,
const VkViewport* viewports, const VkViewport* viewports,
const VkRect2D* scissorRects) { const VkRect2D* scissorRects) {
if (m_state.gp.state.rsViewportCount != viewportCount) { if (m_state.gp.state.rs.viewportCount() != viewportCount) {
m_state.gp.state.rsViewportCount = viewportCount; m_state.gp.state.rs.setViewportCount(viewportCount);
m_flags.set(DxvkContextFlag::GpDirtyPipelineState); m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
} }
@ -2281,12 +2281,14 @@ namespace dxvk {
void DxvkContext::setRasterizerState(const DxvkRasterizerState& rs) { void DxvkContext::setRasterizerState(const DxvkRasterizerState& rs) {
m_state.gp.state.rsDepthClipEnable = rs.depthClipEnable; m_state.gp.state.rs = DxvkRsInfo(
m_state.gp.state.rsDepthBiasEnable = rs.depthBiasEnable; rs.depthClipEnable,
m_state.gp.state.rsPolygonMode = rs.polygonMode; rs.depthBiasEnable,
m_state.gp.state.rsCullMode = rs.cullMode; rs.polygonMode,
m_state.gp.state.rsFrontFace = rs.frontFace; rs.cullMode,
m_state.gp.state.rsSampleCount = rs.sampleCount; rs.frontFace,
m_state.gp.state.rs.viewportCount(),
rs.sampleCount);
m_flags.set(DxvkContextFlag::GpDirtyPipelineState); m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
} }
@ -4103,7 +4105,7 @@ namespace dxvk {
if (m_flags.test(DxvkContextFlag::GpDirtyViewport)) { if (m_flags.test(DxvkContextFlag::GpDirtyViewport)) {
m_flags.clr(DxvkContextFlag::GpDirtyViewport); m_flags.clr(DxvkContextFlag::GpDirtyViewport);
uint32_t viewportCount = m_state.gp.state.rsViewportCount; uint32_t viewportCount = m_state.gp.state.rs.viewportCount();
m_cmd->cmdSetViewport(0, viewportCount, m_state.vp.viewports.data()); m_cmd->cmdSetViewport(0, viewportCount, m_state.vp.viewports.data());
m_cmd->cmdSetScissor (0, viewportCount, m_state.vp.scissorRects.data()); m_cmd->cmdSetScissor (0, viewportCount, m_state.vp.scissorRects.data());
} }

View File

@ -160,8 +160,8 @@ namespace dxvk {
if (state.msSampleCount) if (state.msSampleCount)
sampleCount = VkSampleCountFlagBits(state.msSampleCount); sampleCount = VkSampleCountFlagBits(state.msSampleCount);
else if (state.rsSampleCount) else if (state.rs.sampleCount())
sampleCount = VkSampleCountFlagBits(state.rsSampleCount); sampleCount = VkSampleCountFlagBits(state.rs.sampleCount());
// Set up some specialization constants // Set up some specialization constants
DxvkSpecConstants specData; DxvkSpecConstants specData;
@ -301,9 +301,9 @@ namespace dxvk {
vpInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; vpInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
vpInfo.pNext = nullptr; vpInfo.pNext = nullptr;
vpInfo.flags = 0; vpInfo.flags = 0;
vpInfo.viewportCount = state.rsViewportCount; vpInfo.viewportCount = state.rs.viewportCount();
vpInfo.pViewports = nullptr; vpInfo.pViewports = nullptr;
vpInfo.scissorCount = state.rsViewportCount; vpInfo.scissorCount = state.rs.viewportCount();
vpInfo.pScissors = nullptr; vpInfo.pScissors = nullptr;
VkPipelineRasterizationStateStreamCreateInfoEXT xfbStreamInfo; VkPipelineRasterizationStateStreamCreateInfoEXT xfbStreamInfo;
@ -316,7 +316,7 @@ namespace dxvk {
rsDepthClipInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT; rsDepthClipInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT;
rsDepthClipInfo.pNext = nullptr; rsDepthClipInfo.pNext = nullptr;
rsDepthClipInfo.flags = 0; rsDepthClipInfo.flags = 0;
rsDepthClipInfo.depthClipEnable = state.rsDepthClipEnable; rsDepthClipInfo.depthClipEnable = state.rs.depthClipEnable();
VkPipelineRasterizationStateCreateInfo rsInfo; VkPipelineRasterizationStateCreateInfo rsInfo;
rsInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; rsInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
@ -324,10 +324,10 @@ namespace dxvk {
rsInfo.flags = 0; rsInfo.flags = 0;
rsInfo.depthClampEnable = VK_TRUE; rsInfo.depthClampEnable = VK_TRUE;
rsInfo.rasterizerDiscardEnable = rasterizedStream < 0; rsInfo.rasterizerDiscardEnable = rasterizedStream < 0;
rsInfo.polygonMode = state.rsPolygonMode; rsInfo.polygonMode = state.rs.polygonMode();
rsInfo.cullMode = state.rsCullMode; rsInfo.cullMode = state.rs.cullMode();
rsInfo.frontFace = state.rsFrontFace; rsInfo.frontFace = state.rs.frontFace();
rsInfo.depthBiasEnable = state.rsDepthBiasEnable; rsInfo.depthBiasEnable = state.rs.depthBiasEnable();
rsInfo.depthBiasConstantFactor= 0.0f; rsInfo.depthBiasConstantFactor= 0.0f;
rsInfo.depthBiasClamp = 0.0f; rsInfo.depthBiasClamp = 0.0f;
rsInfo.depthBiasSlopeFactor = 0.0f; rsInfo.depthBiasSlopeFactor = 0.0f;
@ -338,7 +338,7 @@ namespace dxvk {
if (!m_pipeMgr->m_device->features().extDepthClipEnable.depthClipEnable) { if (!m_pipeMgr->m_device->features().extDepthClipEnable.depthClipEnable) {
rsInfo.pNext = rsDepthClipInfo.pNext; rsInfo.pNext = rsDepthClipInfo.pNext;
rsInfo.depthClampEnable = !state.rsDepthClipEnable; rsInfo.depthClampEnable = !state.rs.depthClipEnable();
} }
VkPipelineMultisampleStateCreateInfo msInfo; VkPipelineMultisampleStateCreateInfo msInfo;

View File

@ -207,6 +207,81 @@ namespace dxvk {
}; };
/**
* \brief Packed rasterizer state
*
* Stores a bunch of flags and parameters
* related to rasterization in four bytes.
*/
class DxvkRsInfo {
public:
DxvkRsInfo() = default;
DxvkRsInfo(
VkBool32 depthClipEnable,
VkBool32 depthBiasEnable,
VkPolygonMode polygonMode,
VkCullModeFlags cullMode,
VkFrontFace frontFace,
uint32_t viewportCount,
VkSampleCountFlags sampleCount)
: m_depthClipEnable (uint32_t(depthClipEnable)),
m_depthBiasEnable (uint32_t(depthBiasEnable)),
m_polygonMode (uint32_t(polygonMode)),
m_cullMode (uint32_t(cullMode)),
m_frontFace (uint32_t(frontFace)),
m_viewportCount (uint32_t(viewportCount)),
m_sampleCount (uint32_t(sampleCount)),
m_reserved (0) { }
VkBool32 depthClipEnable() const {
return VkBool32(m_depthClipEnable);
}
VkBool32 depthBiasEnable() const {
return VkBool32(m_depthBiasEnable);
}
VkPolygonMode polygonMode() const {
return VkPolygonMode(m_polygonMode);
}
VkCullModeFlags cullMode() const {
return VkCullModeFlags(m_cullMode);
}
VkFrontFace frontFace() const {
return VkFrontFace(m_frontFace);
}
uint32_t viewportCount() const {
return m_viewportCount;
}
VkSampleCountFlags sampleCount() const {
return VkSampleCountFlags(m_sampleCount);
}
void setViewportCount(uint32_t viewportCount) {
m_viewportCount = viewportCount;
}
private:
uint32_t m_depthClipEnable : 1;
uint32_t m_depthBiasEnable : 1;
uint32_t m_polygonMode : 2;
uint32_t m_cullMode : 2;
uint32_t m_frontFace : 1;
uint32_t m_viewportCount : 5;
uint32_t m_sampleCount : 5;
uint32_t m_reserved : 15;
};
/** /**
* \brief Packed graphics pipeline state * \brief Packed graphics pipeline state
* *
@ -241,7 +316,7 @@ namespace dxvk {
} }
bool useDynamicDepthBias() const { bool useDynamicDepthBias() const {
return rsDepthBiasEnable; return rs.depthBiasEnable();
} }
bool useDynamicDepthBounds() const { bool useDynamicDepthBounds() const {
@ -265,14 +340,7 @@ namespace dxvk {
DxvkBindingMask bsBindingMask; DxvkBindingMask bsBindingMask;
DxvkIaInfo ia; DxvkIaInfo ia;
DxvkIlInfo il; DxvkIlInfo il;
DxvkRsInfo rs;
VkBool32 rsDepthClipEnable;
VkBool32 rsDepthBiasEnable;
VkPolygonMode rsPolygonMode;
VkCullModeFlags rsCullMode;
VkFrontFace rsFrontFace;
uint32_t rsViewportCount;
VkSampleCountFlags rsSampleCount;
VkSampleCountFlags msSampleCount; VkSampleCountFlags msSampleCount;
uint32_t msSampleMask; uint32_t msSampleMask;