Ensure texture ID is valid before getting texture descriptor (#3406)
This commit is contained in:
parent
8aff17a93c
commit
e747f5cd83
4 changed files with 33 additions and 25 deletions
|
@ -101,6 +101,16 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
/// <returns>The GPU resource with the given ID</returns>
|
||||
public abstract T1 Get(int id);
|
||||
|
||||
/// <summary>
|
||||
/// Checks if a given ID is valid and inside the range of the pool.
|
||||
/// </summary>
|
||||
/// <param name="id">ID of the descriptor. This is effectively a zero-based index</param>
|
||||
/// <returns>True if the specified ID is valid, false otherwise</returns>
|
||||
public bool IsValidId(int id)
|
||||
{
|
||||
return (uint)id <= MaximumId;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Synchronizes host memory with guest memory.
|
||||
/// This causes invalidation of pool entries,
|
||||
|
|
|
@ -738,7 +738,22 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
|
||||
TexturePool texturePool = _texturePoolCache.FindOrCreate(_channel, poolAddress, maximumId);
|
||||
|
||||
return texturePool.GetDescriptor(textureId);
|
||||
TextureDescriptor descriptor;
|
||||
|
||||
if (texturePool.IsValidId(textureId))
|
||||
{
|
||||
descriptor = texturePool.GetDescriptor(textureId);
|
||||
}
|
||||
else
|
||||
{
|
||||
// If the ID is not valid, we just return a default descriptor with the most common state.
|
||||
// Since this is used for shader specialization, doing so might avoid the need for recompilations.
|
||||
descriptor = new TextureDescriptor();
|
||||
descriptor.Word4 |= (uint)TextureTarget.Texture2D << 23;
|
||||
descriptor.Word5 |= 1u << 31; // Coords normalized.
|
||||
}
|
||||
|
||||
return descriptor;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -241,25 +241,6 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
return (TextureMsaaMode)((Word7 >> 8) & 0xf);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create the equivalent of this TextureDescriptor for the shader cache.
|
||||
/// </summary>
|
||||
/// <returns>The equivalent of this TextureDescriptor for the shader cache.</returns>
|
||||
public GuestTextureDescriptor ToCache()
|
||||
{
|
||||
GuestTextureDescriptor result = new GuestTextureDescriptor
|
||||
{
|
||||
Handle = uint.MaxValue,
|
||||
Format = UnpackFormat(),
|
||||
Target = UnpackTextureTarget(),
|
||||
IsSrgb = UnpackSrgb(),
|
||||
IsTextureCoordNormalized = UnpackTextureCoordNormalized(),
|
||||
|
||||
};
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check if two descriptors are equal.
|
||||
/// </summary>
|
||||
|
|
|
@ -579,9 +579,10 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|||
textureKey.StageIndex);
|
||||
|
||||
int packedId = TextureHandle.ReadPackedId(textureKey.Handle, cachedTextureBuffer, cachedSamplerBuffer);
|
||||
|
||||
int textureId = TextureHandle.UnpackTextureId(packedId);
|
||||
|
||||
if (pool.IsValidId(textureId))
|
||||
{
|
||||
ref readonly Image.TextureDescriptor descriptor = ref pool.GetDescriptorRef(textureId);
|
||||
|
||||
if (!MatchesTexture(kv.Value, descriptor))
|
||||
|
@ -590,6 +591,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
Reference in a new issue