Archived
1
0
Fork 0
forked from Mirror/Ryujinx

Fix wrong maximum id on sampler pool in some cases

This commit is contained in:
gdkchan 2019-12-06 20:19:12 -03:00 committed by Thog
parent cb171f6ebf
commit 17fb11ddb9
6 changed files with 14 additions and 10 deletions

View file

@ -123,7 +123,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
} }
// Pools. // Pools.
if (state.QueryModified(MethodOffset.SamplerPoolState)) if (state.QueryModified(MethodOffset.SamplerPoolState, MethodOffset.SamplerIndex))
{ {
UpdateSamplerPoolState(state); UpdateSamplerPoolState(state);
} }
@ -422,11 +422,16 @@ namespace Ryujinx.Graphics.Gpu.Engine
private void UpdateSamplerPoolState(GpuState state) private void UpdateSamplerPoolState(GpuState state)
{ {
var texturePool = state.Get<PoolState>(MethodOffset.TexturePoolState);
var samplerPool = state.Get<PoolState>(MethodOffset.SamplerPoolState); var samplerPool = state.Get<PoolState>(MethodOffset.SamplerPoolState);
var samplerIndex = state.Get<SamplerIndex>(MethodOffset.SamplerIndex); var samplerIndex = state.Get<SamplerIndex>(MethodOffset.SamplerIndex);
_textureManager.SetGraphicsSamplerPool(samplerPool.Address.Pack(), samplerPool.MaximumId, samplerIndex); int maximumId = samplerIndex == SamplerIndex.ViaHeaderIndex
? texturePool.MaximumId
: samplerPool.MaximumId;
_textureManager.SetGraphicsSamplerPool(samplerPool.Address.Pack(), maximumId, samplerIndex);
} }
private void UpdateTexturePoolState(GpuState state) private void UpdateTexturePoolState(GpuState state)

View file

@ -11,12 +11,15 @@ namespace Ryujinx.Graphics.Gpu.Image
protected T[] Items; protected T[] Items;
public int MaximumId { get; }
public ulong Address { get; } public ulong Address { get; }
public ulong Size { get; } public ulong Size { get; }
public Pool(GpuContext context, ulong address, int maximumId) public Pool(GpuContext context, ulong address, int maximumId)
{ {
Context = context; Context = context;
MaximumId = maximumId;
int count = maximumId + 1; int count = maximumId + 1;

View file

@ -76,7 +76,7 @@ namespace Ryujinx.Graphics.Gpu.Image
if (_samplerPool != null) if (_samplerPool != null)
{ {
if (_samplerPool.Address == address) if (_samplerPool.Address == address && _samplerPool.MaximumId >= maximumId)
{ {
return; return;
} }

View file

@ -180,9 +180,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
public static void DeclareLocals(CodeGenContext context, StructuredProgramInfo info) public static void DeclareLocals(CodeGenContext context, StructuredProgramInfo info)
{ {
context.AppendLine(GetVarTypeName(VariableType.S32) + " " + DefaultNames.DummyIntName + ";");
context.AppendLine(GetVarTypeName(VariableType.U32) + " " + DefaultNames.DummyUintName + ";");
foreach (AstOperand decl in info.Locals) foreach (AstOperand decl in info.Locals)
{ {
string name = context.OperandManager.DeclareLocal(decl); string name = context.OperandManager.DeclareLocal(decl);

View file

@ -22,9 +22,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
public const string LocalMemoryName = "local_mem"; public const string LocalMemoryName = "local_mem";
public const string SharedMemoryName = "shared_mem"; public const string SharedMemoryName = "shared_mem";
public const string DummyIntName = "dummyInt";
public const string DummyUintName = "dummyUint";
public const string UndefinedName = "undef"; public const string UndefinedName = "undef";
} }
} }

View file

@ -241,6 +241,8 @@ namespace Ryujinx.Graphics.Shader.Instructions
res = context.IAdd(res, srcC); res = context.IAdd(res, srcC);
// TODO: CC, X, SAT, and more?
context.Copy(GetDest(context), res); context.Copy(GetDest(context), res);
} }