1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-01-31 14:52:11 +01:00

[dxvk] Use packed multisample state

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

View File

@ -2295,8 +2295,10 @@ namespace dxvk {
void DxvkContext::setMultisampleState(const DxvkMultisampleState& ms) { void DxvkContext::setMultisampleState(const DxvkMultisampleState& ms) {
m_state.gp.state.msSampleMask = ms.sampleMask; m_state.gp.state.ms = DxvkMsInfo(
m_state.gp.state.msEnableAlphaToCoverage = ms.enableAlphaToCoverage; m_state.gp.state.ms.sampleCount(),
ms.sampleMask,
ms.enableAlphaToCoverage);
m_flags.set(DxvkContextFlag::GpDirtyPipelineState); m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
} }
@ -3973,7 +3975,7 @@ namespace dxvk {
auto fb = m_device->createFramebuffer(m_state.om.renderTargets); auto fb = m_device->createFramebuffer(m_state.om.renderTargets);
m_state.gp.state.msSampleCount = fb->getSampleCount(); m_state.gp.state.ms.setSampleCount(fb->getSampleCount());
m_state.om.framebuffer = fb; m_state.om.framebuffer = fb;
for (uint32_t i = 0; i < MaxNumRenderTargets; i++) { for (uint32_t i = 0; i < MaxNumRenderTargets; i++) {

View File

@ -158,8 +158,8 @@ namespace dxvk {
// Figure out the actual sample count to use // Figure out the actual sample count to use
VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT; VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT;
if (state.msSampleCount) if (state.ms.sampleCount())
sampleCount = VkSampleCountFlagBits(state.msSampleCount); sampleCount = VkSampleCountFlagBits(state.ms.sampleCount());
else if (state.rs.sampleCount()) else if (state.rs.sampleCount())
sampleCount = VkSampleCountFlagBits(state.rs.sampleCount()); sampleCount = VkSampleCountFlagBits(state.rs.sampleCount());
@ -341,6 +341,8 @@ namespace dxvk {
rsInfo.depthClampEnable = !state.rs.depthClipEnable(); rsInfo.depthClampEnable = !state.rs.depthClipEnable();
} }
uint32_t sampleMask = state.ms.sampleMask();
VkPipelineMultisampleStateCreateInfo msInfo; VkPipelineMultisampleStateCreateInfo msInfo;
msInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; msInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
msInfo.pNext = nullptr; msInfo.pNext = nullptr;
@ -348,8 +350,8 @@ namespace dxvk {
msInfo.rasterizationSamples = sampleCount; msInfo.rasterizationSamples = sampleCount;
msInfo.sampleShadingEnable = m_common.msSampleShadingEnable; msInfo.sampleShadingEnable = m_common.msSampleShadingEnable;
msInfo.minSampleShading = m_common.msSampleShadingFactor; msInfo.minSampleShading = m_common.msSampleShadingFactor;
msInfo.pSampleMask = &state.msSampleMask; msInfo.pSampleMask = &sampleMask;
msInfo.alphaToCoverageEnable = state.msEnableAlphaToCoverage; msInfo.alphaToCoverageEnable = state.ms.enableAlphaToCoverage();
msInfo.alphaToOneEnable = VK_FALSE; msInfo.alphaToOneEnable = VK_FALSE;
VkPipelineDepthStencilStateCreateInfo dsInfo; VkPipelineDepthStencilStateCreateInfo dsInfo;

View File

@ -282,6 +282,53 @@ namespace dxvk {
}; };
/**
* \brief Packed multisample info
*
* Stores the sample mask, sample count override
* and alpha-to-coverage state in four bytes.
*/
class DxvkMsInfo {
public:
DxvkMsInfo() = default;
DxvkMsInfo(
VkSampleCountFlags sampleCount,
uint32_t sampleMask,
VkBool32 enableAlphaToCoverage)
: m_sampleCount (uint16_t(sampleCount)),
m_enableAlphaToCoverage (uint16_t(enableAlphaToCoverage)),
m_reserved (0),
m_sampleMask (uint16_t(sampleMask)) { }
VkSampleCountFlags sampleCount() const {
return VkSampleCountFlags(m_sampleCount);
}
uint32_t sampleMask() const {
return m_sampleMask;
}
VkBool32 enableAlphaToCoverage() const {
return VkBool32(m_enableAlphaToCoverage);
}
void setSampleCount(VkSampleCountFlags sampleCount) {
m_sampleCount = uint16_t(sampleCount);
}
private:
uint16_t m_sampleCount : 5;
uint16_t m_enableAlphaToCoverage : 1;
uint16_t m_reserved : 10;
uint16_t m_sampleMask;
};
/** /**
* \brief Packed graphics pipeline state * \brief Packed graphics pipeline state
* *
@ -341,10 +388,7 @@ namespace dxvk {
DxvkIaInfo ia; DxvkIaInfo ia;
DxvkIlInfo il; DxvkIlInfo il;
DxvkRsInfo rs; DxvkRsInfo rs;
DxvkMsInfo ms;
VkSampleCountFlags msSampleCount;
uint32_t msSampleMask;
VkBool32 msEnableAlphaToCoverage;
VkBool32 dsEnableDepthTest; VkBool32 dsEnableDepthTest;
VkBool32 dsEnableDepthWrite; VkBool32 dsEnableDepthWrite;