Update postEffect.cpp

this fixes a small issue where dx doesnt like an empty target, if we do target[0] = backbuffer and target[1] = $outTex it was complaining that target[0] was null. When using the backbuffer this would be null because we write to that a different way.
This commit is contained in:
marauder2k7 2026-04-19 18:24:35 +01:00
parent d33edb051c
commit dbc4bb37fe

View file

@ -1261,39 +1261,26 @@ void PostEffect::_setupTransforms()
void PostEffect::_setupTarget( const SceneRenderState *state, bool *outClearTarget ) void PostEffect::_setupTarget( const SceneRenderState *state, bool *outClearTarget )
{ {
Point2I targetSize;
if (!mTargetSize.isZero())
targetSize = mTargetSize;
else if (mActiveTextures[0])
{
const Point3I& texSize = mActiveTextures[0]->getSize();
targetSize.set(texSize.x * mTargetScale.x, texSize.y * mTargetScale.y);
}
else
{
GFXTarget* oldTarget = GFX->getActiveRenderTarget();
const Point2I& oldTargetSize = oldTarget->getSize();
targetSize.set(oldTargetSize.x * mTargetScale.x, oldTargetSize.y * mTargetScale.y);
}
targetSize.setMax(Point2I::One);
for (U32 c = 0; c < NumMRTTargets; c++) for (U32 c = 0; c < NumMRTTargets; c++)
{ {
if (mNamedTarget[c].isRegistered() || _outTexSlotFromName(mTargetName[c]) >= 0) if (mNamedTarget[c].isRegistered() || _outTexSlotFromName(mTargetName[c]) >= 0)
{ {
// Size it relative to the texture of the first stage or
// if NULL then use the current target.
Point2I targetSize;
// If we have an absolute target size then use that.
if (!mTargetSize.isZero())
targetSize = mTargetSize;
// Else generate a relative size using the target scale.
else if (mActiveTextures[0])
{
const Point3I& texSize = mActiveTextures[0]->getSize();
targetSize.set(texSize.x * mTargetScale.x,
texSize.y * mTargetScale.y);
}
else
{
GFXTarget* oldTarget = GFX->getActiveRenderTarget();
const Point2I& oldTargetSize = oldTarget->getSize();
targetSize.set(oldTargetSize.x * mTargetScale.x,
oldTargetSize.y * mTargetScale.y);
}
// Make sure its at least 1x1.
targetSize.setMax(Point2I::One);
if (mNamedTarget[c].isRegistered() || if (mNamedTarget[c].isRegistered() ||
!mTargetTex[c] || !mTargetTex[c] ||
mTargetTex[c].getWidthHeight() != targetSize) mTargetTex[c].getWidthHeight() != targetSize)
@ -1311,24 +1298,22 @@ void PostEffect::_setupTarget( const SceneRenderState *state, bool *outClearTarg
GFXTarget* oldTarget = GFX->getActiveRenderTarget(); GFXTarget* oldTarget = GFX->getActiveRenderTarget();
const Point2I& oldTargetSize = oldTarget->getSize(); const Point2I& oldTargetSize = oldTarget->getSize();
Point2F scale(targetSize.x / F32(oldTargetSize.x), targetSize.y / F32(oldTargetSize.y)); Point2F scale(targetSize.x / F32(oldTargetSize.x), targetSize.y / F32(oldTargetSize.y));
const RectI& viewport = GFX->getViewport(); const RectI& viewport = GFX->getViewport();
mNamedTarget[c].setViewport(RectI(viewport.point.x * scale.x, viewport.point.y * scale.y,
mNamedTarget[c].setViewport(RectI(viewport.point.x * scale.x, viewport.point.y * scale.y, viewport.extent.x * scale.x, viewport.extent.y * scale.y)); viewport.extent.x * scale.x, viewport.extent.y * scale.y));
} }
else if (mTargetViewport == PFXTargetViewport_NamedInTexture0 && mActiveNamedTarget[0] && mActiveNamedTarget[0]->getTexture()) else if (mTargetViewport == PFXTargetViewport_NamedInTexture0
&& mActiveNamedTarget[0] && mActiveNamedTarget[0]->getTexture())
{ {
// Scale the named input texture's viewport to match our target // Scale the named input texture's viewport to match our target
const Point3I& namedTargetSize = mActiveNamedTarget[0]->getTexture()->getSize(); const Point3I& namedTargetSize = mActiveNamedTarget[0]->getTexture()->getSize();
Point2F scale(targetSize.x / F32(namedTargetSize.x), targetSize.y / F32(namedTargetSize.y)); Point2F scale(targetSize.x / F32(namedTargetSize.x), targetSize.y / F32(namedTargetSize.y));
const RectI& viewport = mActiveNamedTarget[0]->getViewport(); const RectI& viewport = mActiveNamedTarget[0]->getViewport();
mNamedTarget[c].setViewport(RectI(viewport.point.x * scale.x, viewport.point.y * scale.y,
mNamedTarget[c].setViewport(RectI(viewport.point.x * scale.x, viewport.point.y * scale.y, viewport.extent.x * scale.x, viewport.extent.y * scale.y)); viewport.extent.x * scale.x, viewport.extent.y * scale.y));
} }
else else
{ {
// PFXTargetViewport_TargetSize
mNamedTarget[c].setViewport(RectI(0, 0, targetSize.x, targetSize.y)); mNamedTarget[c].setViewport(RectI(0, 0, targetSize.x, targetSize.y));
} }
} }
@ -1337,39 +1322,30 @@ void PostEffect::_setupTarget( const SceneRenderState *state, bool *outClearTarg
mTargetTex[c] = NULL; mTargetTex[c] = NULL;
} }
// Do we have a named depthStencil target? bool auxActive = false;
for (U32 c = 1; c < NumMRTTargets; c++)
{
if (mTargetTex[c].isValid())
{
auxActive = true;
break;
}
}
if (auxActive && !mTargetTex[0].isValid())
{
/* If we have issues later on, uncomment this!
Con::warnf("PostEffect '%s': auxiliary MRT slots are active but target[0] "
"has no texture. Auto-promoting slot 0 to a temporary. "
"Use a named target (#name) on slot 0 for MRT setups.", getName());*/
mTargetTex[0].set(targetSize.x, targetSize.y, mTargetFormat[0],
&PostFxTargetProfile, "PostEffect::MRTSlot[0]_auto", mMipCap);
}
if (mNamedTargetDepthStencil.isRegistered()) if (mNamedTargetDepthStencil.isRegistered())
{ {
// Size it relative to the texture of the first stage or if (mNamedTargetDepthStencil.isRegistered() && mTargetDepthStencil.getWidthHeight() != targetSize)
// if NULL then use the current target.
Point2I targetSize;
// If we have an absolute target size then use that.
if (!mTargetSize.isZero())
targetSize = mTargetSize;
// Else generate a relative size using the target scale.
else if (mActiveTextures[0])
{
const Point3I& texSize = mActiveTextures[0]->getSize();
targetSize.set(texSize.x * mTargetScale.x,
texSize.y * mTargetScale.y);
}
else
{
GFXTarget* oldTarget = GFX->getActiveRenderTarget();
const Point2I& oldTargetSize = oldTarget->getSize();
targetSize.set(oldTargetSize.x * mTargetScale.x,
oldTargetSize.y * mTargetScale.y);
}
// Make sure its at least 1x1.
targetSize.setMax(Point2I::One);
if (mNamedTargetDepthStencil.isRegistered() &&
mTargetDepthStencil.getWidthHeight() != targetSize)
{ {
mTargetDepthStencil.set(targetSize.x, targetSize.y, GFXFormatD24S8, mTargetDepthStencil.set(targetSize.x, targetSize.y, GFXFormatD24S8,
&GFXZTargetProfile, "PostEffect::_setupTarget"); &GFXZTargetProfile, "PostEffect::_setupTarget");
@ -1384,7 +1360,6 @@ void PostEffect::_setupTarget( const SceneRenderState *state, bool *outClearTarg
GFXTarget* oldTarget = GFX->getActiveRenderTarget(); GFXTarget* oldTarget = GFX->getActiveRenderTarget();
const Point2I& oldTargetSize = oldTarget->getSize(); const Point2I& oldTargetSize = oldTarget->getSize();
Point2F scale(targetSize.x / F32(oldTargetSize.x), targetSize.y / F32(oldTargetSize.y)); Point2F scale(targetSize.x / F32(oldTargetSize.x), targetSize.y / F32(oldTargetSize.y));
const RectI& viewport = GFX->getViewport(); const RectI& viewport = GFX->getViewport();
mNamedTargetDepthStencil.setViewport(RectI(viewport.point.x * scale.x, viewport.point.y * scale.y, viewport.extent.x * scale.x, viewport.extent.y * scale.y)); mNamedTargetDepthStencil.setViewport(RectI(viewport.point.x * scale.x, viewport.point.y * scale.y, viewport.extent.x * scale.x, viewport.extent.y * scale.y));
@ -1394,7 +1369,6 @@ void PostEffect::_setupTarget( const SceneRenderState *state, bool *outClearTarg
// Scale the named input texture's viewport to match our target // Scale the named input texture's viewport to match our target
const Point3I& namedTargetSize = mActiveNamedTarget[0]->getTexture()->getSize(); const Point3I& namedTargetSize = mActiveNamedTarget[0]->getTexture()->getSize();
Point2F scale(targetSize.x / F32(namedTargetSize.x), targetSize.y / F32(namedTargetSize.y)); Point2F scale(targetSize.x / F32(namedTargetSize.x), targetSize.y / F32(namedTargetSize.y));
const RectI& viewport = mActiveNamedTarget[0]->getViewport(); const RectI& viewport = mActiveNamedTarget[0]->getViewport();
mNamedTargetDepthStencil.setViewport(RectI(viewport.point.x * scale.x, viewport.point.y * scale.y, viewport.extent.x * scale.x, viewport.extent.y * scale.y)); mNamedTargetDepthStencil.setViewport(RectI(viewport.point.x * scale.x, viewport.point.y * scale.y, viewport.extent.x * scale.x, viewport.extent.y * scale.y));
@ -1412,7 +1386,11 @@ void PostEffect::_setupTarget( const SceneRenderState *state, bool *outClearTarg
if (mTargetClear[0] == PFXTargetClear_OnDraw) if (mTargetClear[0] == PFXTargetClear_OnDraw)
*outClearTarget = true; *outClearTarget = true;
if (!mTarget && (mTargetTex || mTargetDepthStencil)) bool hasAny = mTargetDepthStencil.isValid();
for (U32 c = 0; c < NumMRTTargets && !hasAny; c++)
hasAny = mTargetTex[c].isValid();
if (!mTarget && hasAny)
mTarget = GFX->allocRenderToTextureTarget(); mTarget = GFX->allocRenderToTextureTarget();
} }