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

[dxvk] Move render target set comparison to DxvkRenderTargets

This commit is contained in:
Philip Rebohle 2018-04-15 03:01:52 +02:00
parent d523405a5a
commit 31ed6e5cd3
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 29 additions and 23 deletions

View File

@ -88,7 +88,6 @@ namespace dxvk {
void DxvkContext::bindFramebuffer(const Rc<DxvkFramebuffer>& fb) {
if (m_state.om.framebuffer != fb) {
this->renderPassEnd();
m_state.om.framebuffer = fb;
if (fb != nullptr) {
m_state.gp.state.msSampleCount = fb->sampleCount();
@ -96,38 +95,22 @@ namespace dxvk {
m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
}
m_state.om.framebuffer = fb;
}
}
void DxvkContext::bindRenderTargets(const DxvkRenderTargets& targets) {
bool needsUpdate = false;
bool sameAsCurr = m_state.om.framebuffer != nullptr
&& m_state.om.framebuffer->renderTargets().matches(targets);
if (m_state.om.framebuffer != nullptr) {
const DxvkRenderTargets& active = m_state.om.framebuffer->renderTargets();
needsUpdate |= active.getDepthTarget().view != targets.getDepthTarget().view
|| active.getDepthTarget().layout != targets.getDepthTarget().layout;
for (uint32_t i = 0; i < MaxNumRenderTargets && !needsUpdate; i++) {
needsUpdate |= active.getColorTarget(i).view != targets.getColorTarget(i).view
|| active.getColorTarget(i).layout != targets.getColorTarget(i).layout;
}
} else {
needsUpdate = targets.hasAttachments();
}
if (needsUpdate) {
if (!sameAsCurr) {
Rc<DxvkFramebuffer> fb = targets.hasAttachments()
? m_device->createFramebuffer(targets)
: nullptr;
if (fb != nullptr) {
m_state.gp.state.msSampleCount = fb->sampleCount();
m_state.gp.state.omRenderPass = fb->renderPass();
m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
}
this->bindFramebuffer(fb);
}
}

View File

@ -71,6 +71,19 @@ namespace dxvk {
}
bool DxvkRenderTargets::matches(const DxvkRenderTargets& other) const {
bool equal = m_depthTarget.view == other.m_depthTarget.view
&& m_depthTarget.layout == other.m_depthTarget.layout;
for (uint32_t i = 0; i < MaxNumRenderTargets && equal; i++) {
equal &= m_colorTargets.at(i).view == other.m_colorTargets.at(i).view
&& m_colorTargets.at(i).layout == other.m_colorTargets.at(i).layout;
}
return equal;
}
DxvkFramebufferSize DxvkRenderTargets::renderTargetSize(
const Rc<DxvkImageView>& renderTarget) const {
auto extent = renderTarget->mipLevelExtent(0);

View File

@ -116,6 +116,16 @@ namespace dxvk {
*/
bool hasAttachments() const;
/**
* \brief Compares two sets of render targets
*
* Checks whether two sets of render targets
* are identical, including the image layout.
* \param [in] other Render target set to compare to
* \returns \c true if the render targets are the same
*/
bool matches(const DxvkRenderTargets& other) const;
private:
std::array<DxvkAttachment, MaxNumRenderTargets> m_colorTargets;