Work around Adreno compute dispatch crash when changing grpahics state with a compute pipeline bound

This commit is contained in:
Gabriel A 2023-07-10 23:32:31 -03:00 committed by Emmanuel Hansen
parent 437bfdbd5a
commit 2814fa60bf
2 changed files with 31 additions and 21 deletions

View File

@ -1588,36 +1588,42 @@ namespace Ryujinx.Graphics.Vulkan
DynamicState.ReplayIfDirty(Gd.Api, CommandBuffer);
if (_needsIndexBufferRebind && _indexBufferPattern == null)
// Setting graphics state with a compute pipeline bound crashes the Adreno driver.
if (pbp == PipelineBindPoint.Graphics)
{
_indexBuffer.BindIndexBuffer(Gd, Cbs);
_needsIndexBufferRebind = false;
}
DynamicState.ReplayIfDirty(Gd.Api, CommandBuffer);
if (_needsTransformFeedbackBuffersRebind)
{
PauseTransformFeedbackInternal();
for (int i = 0; i < Constants.MaxTransformFeedbackBuffers; i++)
if (_needsIndexBufferRebind && _indexBufferPattern == null)
{
_transformFeedbackBuffers[i].BindTransformFeedbackBuffer(Gd, Cbs, (uint)i);
_indexBuffer.BindIndexBuffer(Gd, Cbs);
_needsIndexBufferRebind = false;
}
_needsTransformFeedbackBuffersRebind = false;
}
if (_vertexBuffersDirty != 0)
{
while (_vertexBuffersDirty != 0)
if (_needsTransformFeedbackBuffersRebind)
{
int i = BitOperations.TrailingZeroCount(_vertexBuffersDirty);
PauseTransformFeedbackInternal();
_vertexBuffers[i].BindVertexBuffer(Gd, Cbs, (uint)i, ref _newState, _vertexBufferUpdater);
for (int i = 0; i < Constants.MaxTransformFeedbackBuffers; i++)
{
_transformFeedbackBuffers[i].BindTransformFeedbackBuffer(Gd, Cbs, (uint)i);
}
_vertexBuffersDirty &= ~(1UL << i);
_needsTransformFeedbackBuffersRebind = false;
}
_vertexBufferUpdater.Commit(Cbs);
if (_vertexBuffersDirty != 0)
{
while (_vertexBuffersDirty != 0)
{
int i = BitOperations.TrailingZeroCount(_vertexBuffersDirty);
_vertexBuffers[i].BindVertexBuffer(Gd, Cbs, (uint)i, ref _newState, _vertexBufferUpdater);
_vertexBuffersDirty &= ~(1UL << i);
}
_vertexBufferUpdater.Commit(Cbs);
}
}
if (_stateDirty || Pbp != pbp)

View File

@ -246,7 +246,11 @@ namespace Ryujinx.Graphics.Vulkan
SignalCommandBufferChange();
DynamicState.ReplayIfDirty(Gd.Api, CommandBuffer);
// Setting graphics state with a compute pipeline bound crashes the Adreno driver.
if (Pbp == PipelineBindPoint.Graphics)
{
DynamicState.ReplayIfDirty(Gd.Api, CommandBuffer);
}
}
public void FlushCommandsImpl()