mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 22:29:15 +01:00
[dxvk] Move render target set comparison to DxvkRenderTargets
This commit is contained in:
parent
d523405a5a
commit
31ed6e5cd3
@ -88,7 +88,6 @@ namespace dxvk {
|
|||||||
void DxvkContext::bindFramebuffer(const Rc<DxvkFramebuffer>& fb) {
|
void DxvkContext::bindFramebuffer(const Rc<DxvkFramebuffer>& fb) {
|
||||||
if (m_state.om.framebuffer != fb) {
|
if (m_state.om.framebuffer != fb) {
|
||||||
this->renderPassEnd();
|
this->renderPassEnd();
|
||||||
m_state.om.framebuffer = fb;
|
|
||||||
|
|
||||||
if (fb != nullptr) {
|
if (fb != nullptr) {
|
||||||
m_state.gp.state.msSampleCount = fb->sampleCount();
|
m_state.gp.state.msSampleCount = fb->sampleCount();
|
||||||
@ -96,38 +95,22 @@ namespace dxvk {
|
|||||||
|
|
||||||
m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
|
m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_state.om.framebuffer = fb;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DxvkContext::bindRenderTargets(const DxvkRenderTargets& targets) {
|
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) {
|
if (!sameAsCurr) {
|
||||||
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) {
|
|
||||||
Rc<DxvkFramebuffer> fb = targets.hasAttachments()
|
Rc<DxvkFramebuffer> fb = targets.hasAttachments()
|
||||||
? m_device->createFramebuffer(targets)
|
? m_device->createFramebuffer(targets)
|
||||||
: nullptr;
|
: nullptr;
|
||||||
|
|
||||||
if (fb != nullptr) {
|
this->bindFramebuffer(fb);
|
||||||
m_state.gp.state.msSampleCount = fb->sampleCount();
|
|
||||||
m_state.gp.state.omRenderPass = fb->renderPass();
|
|
||||||
|
|
||||||
m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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(
|
DxvkFramebufferSize DxvkRenderTargets::renderTargetSize(
|
||||||
const Rc<DxvkImageView>& renderTarget) const {
|
const Rc<DxvkImageView>& renderTarget) const {
|
||||||
auto extent = renderTarget->mipLevelExtent(0);
|
auto extent = renderTarget->mipLevelExtent(0);
|
||||||
|
@ -116,6 +116,16 @@ namespace dxvk {
|
|||||||
*/
|
*/
|
||||||
bool hasAttachments() const;
|
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:
|
private:
|
||||||
|
|
||||||
std::array<DxvkAttachment, MaxNumRenderTargets> m_colorTargets;
|
std::array<DxvkAttachment, MaxNumRenderTargets> m_colorTargets;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user