Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
1217a8e69b | ||
|
732db7581f |
@@ -343,11 +343,22 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
|||||||
|
|
||||||
bool unalignedChanged = _currentSpecState.SetHasUnalignedStorageBuffer(_channel.BufferManager.HasUnalignedStorageBuffers);
|
bool unalignedChanged = _currentSpecState.SetHasUnalignedStorageBuffer(_channel.BufferManager.HasUnalignedStorageBuffers);
|
||||||
|
|
||||||
if (!_channel.TextureManager.CommitGraphicsBindings(_shaderSpecState) || unalignedChanged)
|
bool scaleMismatch;
|
||||||
|
do
|
||||||
{
|
{
|
||||||
// Shader must be reloaded. _vtgWritesRtLayer should not change.
|
if (!_channel.TextureManager.CommitGraphicsBindings(_shaderSpecState, out scaleMismatch) || unalignedChanged)
|
||||||
UpdateShaderState();
|
{
|
||||||
|
// Shader must be reloaded. _vtgWritesRtLayer should not change.
|
||||||
|
UpdateShaderState();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scaleMismatch)
|
||||||
|
{
|
||||||
|
// Binding textures changed scale of the bound render targets, correct the render target scale and rebind.
|
||||||
|
UpdateRenderTargetState();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
while (scaleMismatch);
|
||||||
|
|
||||||
_channel.BufferManager.CommitGraphicsBindings(_drawState.DrawIndexed);
|
_channel.BufferManager.CommitGraphicsBindings(_drawState.DrawIndexed);
|
||||||
}
|
}
|
||||||
|
@@ -360,15 +360,16 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// Commits bindings on the graphics pipeline.
|
/// Commits bindings on the graphics pipeline.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="specState">Specialization state for the bound shader</param>
|
/// <param name="specState">Specialization state for the bound shader</param>
|
||||||
|
/// <param name="scaleMismatch">True if there is a scale mismatch in the render targets, indicating they must be re-evaluated</param>
|
||||||
/// <returns>True if all bound textures match the current shader specialization state, false otherwise</returns>
|
/// <returns>True if all bound textures match the current shader specialization state, false otherwise</returns>
|
||||||
public bool CommitGraphicsBindings(ShaderSpecializationState specState)
|
public bool CommitGraphicsBindings(ShaderSpecializationState specState, out bool scaleMismatch)
|
||||||
{
|
{
|
||||||
_texturePoolCache.Tick();
|
_texturePoolCache.Tick();
|
||||||
_samplerPoolCache.Tick();
|
_samplerPoolCache.Tick();
|
||||||
|
|
||||||
bool result = _gpBindingsManager.CommitBindings(specState);
|
bool result = _gpBindingsManager.CommitBindings(specState);
|
||||||
|
|
||||||
UpdateRenderTargets();
|
scaleMismatch = UpdateRenderTargets();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -426,9 +427,12 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update host framebuffer attachments based on currently bound render target buffers.
|
/// Update host framebuffer attachments based on currently bound render target buffers.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void UpdateRenderTargets()
|
/// <returns>True if there is a scale mismatch in the render targets, indicating they must be re-evaluated</returns>
|
||||||
|
public bool UpdateRenderTargets()
|
||||||
{
|
{
|
||||||
bool anyChanged = false;
|
bool anyChanged = false;
|
||||||
|
float expectedScale = RenderTargetScale;
|
||||||
|
bool scaleMismatch = false;
|
||||||
|
|
||||||
Texture dsTexture = _rtDepthStencil;
|
Texture dsTexture = _rtDepthStencil;
|
||||||
ITexture hostDsTexture = null;
|
ITexture hostDsTexture = null;
|
||||||
@@ -448,6 +452,11 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
{
|
{
|
||||||
_rtHostDs = hostDsTexture;
|
_rtHostDs = hostDsTexture;
|
||||||
anyChanged = true;
|
anyChanged = true;
|
||||||
|
|
||||||
|
if (dsTexture != null && dsTexture.ScaleFactor != expectedScale)
|
||||||
|
{
|
||||||
|
scaleMismatch = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int index = 0; index < _rtColors.Length; index++)
|
for (int index = 0; index < _rtColors.Length; index++)
|
||||||
@@ -470,6 +479,11 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
{
|
{
|
||||||
_rtHostColors[index] = hostTexture;
|
_rtHostColors[index] = hostTexture;
|
||||||
anyChanged = true;
|
anyChanged = true;
|
||||||
|
|
||||||
|
if (texture != null && texture.ScaleFactor != expectedScale)
|
||||||
|
{
|
||||||
|
scaleMismatch = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -477,6 +491,8 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
{
|
{
|
||||||
_context.Renderer.Pipeline.SetRenderTargets(_rtHostColors, _rtHostDs);
|
_context.Renderer.Pipeline.SetRenderTargets(_rtHostColors, _rtHostDs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return scaleMismatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@@ -781,7 +781,9 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
{
|
{
|
||||||
PrimitiveTopology.Quads => PrimitiveTopology.Triangles,
|
PrimitiveTopology.Quads => PrimitiveTopology.Triangles,
|
||||||
PrimitiveTopology.QuadStrip => PrimitiveTopology.TriangleStrip,
|
PrimitiveTopology.QuadStrip => PrimitiveTopology.TriangleStrip,
|
||||||
PrimitiveTopology.TriangleFan => Capabilities.PortabilitySubset.HasFlag(PortabilitySubsetFlags.NoTriangleFans) ? PrimitiveTopology.Triangles : topology,
|
PrimitiveTopology.TriangleFan or PrimitiveTopology.Polygon => Capabilities.PortabilitySubset.HasFlag(PortabilitySubsetFlags.NoTriangleFans)
|
||||||
|
? PrimitiveTopology.Triangles
|
||||||
|
: topology,
|
||||||
_ => topology,
|
_ => topology,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -791,7 +793,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
return topology switch
|
return topology switch
|
||||||
{
|
{
|
||||||
PrimitiveTopology.Quads => true,
|
PrimitiveTopology.Quads => true,
|
||||||
PrimitiveTopology.TriangleFan => Capabilities.PortabilitySubset.HasFlag(PortabilitySubsetFlags.NoTriangleFans),
|
PrimitiveTopology.TriangleFan or PrimitiveTopology.Polygon => Capabilities.PortabilitySubset.HasFlag(PortabilitySubsetFlags.NoTriangleFans),
|
||||||
_ => false,
|
_ => false,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user