forked from Mirror/Ryujinx
Fix Vulkan blit-like operations swizzle (#5003)
This commit is contained in:
parent
ecbf303266
commit
f864a49014
3 changed files with 39 additions and 7 deletions
|
@ -228,7 +228,12 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
SignalDirty(DirtyFlags.Storage);
|
SignalDirty(DirtyFlags.Storage);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetTextureAndSampler(CommandBufferScoped cbs, ShaderStage stage, int binding, ITexture texture, ISampler sampler)
|
public void SetTextureAndSampler(
|
||||||
|
CommandBufferScoped cbs,
|
||||||
|
ShaderStage stage,
|
||||||
|
int binding,
|
||||||
|
ITexture texture,
|
||||||
|
ISampler sampler)
|
||||||
{
|
{
|
||||||
if (texture is TextureBuffer textureBuffer)
|
if (texture is TextureBuffer textureBuffer)
|
||||||
{
|
{
|
||||||
|
@ -251,6 +256,28 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
SignalDirty(DirtyFlags.Texture);
|
SignalDirty(DirtyFlags.Texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetTextureAndSamplerIdentitySwizzle(
|
||||||
|
CommandBufferScoped cbs,
|
||||||
|
ShaderStage stage,
|
||||||
|
int binding,
|
||||||
|
ITexture texture,
|
||||||
|
ISampler sampler)
|
||||||
|
{
|
||||||
|
if (texture is TextureView view)
|
||||||
|
{
|
||||||
|
view.Storage.InsertWriteToReadBarrier(cbs, AccessFlags.ShaderReadBit, stage.ConvertToPipelineStageFlags());
|
||||||
|
|
||||||
|
_textureRefs[binding] = view.GetIdentityImageView();
|
||||||
|
_samplerRefs[binding] = ((SamplerHolder)sampler)?.GetSampler();
|
||||||
|
|
||||||
|
SignalDirty(DirtyFlags.Texture);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetTextureAndSampler(cbs, stage, binding, texture, sampler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void SetUniformBuffers(CommandBuffer commandBuffer, ReadOnlySpan<BufferAssignment> buffers)
|
public void SetUniformBuffers(CommandBuffer commandBuffer, ReadOnlySpan<BufferAssignment> buffers)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < buffers.Length; i++)
|
for (int i = 0; i < buffers.Length; i++)
|
||||||
|
|
|
@ -415,7 +415,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
var sampler = linearFilter ? _samplerLinear : _samplerNearest;
|
var sampler = linearFilter ? _samplerLinear : _samplerNearest;
|
||||||
|
|
||||||
_pipeline.SetTextureAndSampler(ShaderStage.Fragment, 0, src, sampler);
|
_pipeline.SetTextureAndSamplerIdentitySwizzle(ShaderStage.Fragment, 0, src, sampler);
|
||||||
|
|
||||||
Span<float> region = stackalloc float[RegionBufferSize / sizeof(float)];
|
Span<float> region = stackalloc float[RegionBufferSize / sizeof(float)];
|
||||||
|
|
||||||
|
@ -625,7 +625,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
private void BlitDepthStencilDraw(TextureView src, bool isDepth)
|
private void BlitDepthStencilDraw(TextureView src, bool isDepth)
|
||||||
{
|
{
|
||||||
_pipeline.SetTextureAndSampler(ShaderStage.Fragment, 0, src, _samplerNearest);
|
_pipeline.SetTextureAndSamplerIdentitySwizzle(ShaderStage.Fragment, 0, src, _samplerNearest);
|
||||||
|
|
||||||
if (isDepth)
|
if (isDepth)
|
||||||
{
|
{
|
||||||
|
@ -1037,7 +1037,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
var srcView = Create2DLayerView(src, srcLayer + z, srcLevel + l, srcFormat);
|
var srcView = Create2DLayerView(src, srcLayer + z, srcLevel + l, srcFormat);
|
||||||
var dstView = Create2DLayerView(dst, dstLayer + z, dstLevel + l);
|
var dstView = Create2DLayerView(dst, dstLayer + z, dstLevel + l);
|
||||||
|
|
||||||
_pipeline.SetTextureAndSampler(ShaderStage.Compute, 0, srcView, null);
|
_pipeline.SetTextureAndSamplerIdentitySwizzle(ShaderStage.Compute, 0, srcView, null);
|
||||||
_pipeline.SetImage(0, dstView, dstFormat);
|
_pipeline.SetImage(0, dstView, dstFormat);
|
||||||
|
|
||||||
int dispatchX = (Math.Min(srcView.Info.Width, dstView.Info.Width) + 31) / 32;
|
int dispatchX = (Math.Min(srcView.Info.Width, dstView.Info.Width) + 31) / 32;
|
||||||
|
@ -1177,7 +1177,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
var srcView = Create2DLayerView(src, srcLayer + z, 0, format);
|
var srcView = Create2DLayerView(src, srcLayer + z, 0, format);
|
||||||
var dstView = Create2DLayerView(dst, dstLayer + z, 0);
|
var dstView = Create2DLayerView(dst, dstLayer + z, 0);
|
||||||
|
|
||||||
_pipeline.SetTextureAndSampler(ShaderStage.Compute, 0, srcView, null);
|
_pipeline.SetTextureAndSamplerIdentitySwizzle(ShaderStage.Compute, 0, srcView, null);
|
||||||
_pipeline.SetImage(0, dstView, format);
|
_pipeline.SetImage(0, dstView, format);
|
||||||
|
|
||||||
_pipeline.DispatchCompute(dispatchX, dispatchY, 1);
|
_pipeline.DispatchCompute(dispatchX, dispatchY, 1);
|
||||||
|
@ -1313,7 +1313,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
var srcView = Create2DLayerView(src, srcLayer + z, 0, format);
|
var srcView = Create2DLayerView(src, srcLayer + z, 0, format);
|
||||||
var dstView = Create2DLayerView(dst, dstLayer + z, 0);
|
var dstView = Create2DLayerView(dst, dstLayer + z, 0);
|
||||||
|
|
||||||
_pipeline.SetTextureAndSampler(ShaderStage.Fragment, 0, srcView, null);
|
_pipeline.SetTextureAndSamplerIdentitySwizzle(ShaderStage.Fragment, 0, srcView, null);
|
||||||
_pipeline.SetRenderTarget(
|
_pipeline.SetRenderTarget(
|
||||||
((TextureView)dstView).GetView(format).GetImageViewForAttachment(),
|
((TextureView)dstView).GetView(format).GetImageViewForAttachment(),
|
||||||
(uint)dst.Width,
|
(uint)dst.Width,
|
||||||
|
@ -1384,7 +1384,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
private void CopyMSAspectDraw(TextureView src, bool fromMS, bool isDepth)
|
private void CopyMSAspectDraw(TextureView src, bool fromMS, bool isDepth)
|
||||||
{
|
{
|
||||||
_pipeline.SetTextureAndSampler(ShaderStage.Fragment, 0, src, _samplerNearest);
|
_pipeline.SetTextureAndSamplerIdentitySwizzle(ShaderStage.Fragment, 0, src, _samplerNearest);
|
||||||
|
|
||||||
if (isDepth)
|
if (isDepth)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1098,6 +1098,11 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
_descriptorSetUpdater.SetTextureAndSampler(Cbs, stage, binding, texture, sampler);
|
_descriptorSetUpdater.SetTextureAndSampler(Cbs, stage, binding, texture, sampler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetTextureAndSamplerIdentitySwizzle(ShaderStage stage, int binding, ITexture texture, ISampler sampler)
|
||||||
|
{
|
||||||
|
_descriptorSetUpdater.SetTextureAndSamplerIdentitySwizzle(Cbs, stage, binding, texture, sampler);
|
||||||
|
}
|
||||||
|
|
||||||
public void SetTransformFeedbackBuffers(ReadOnlySpan<BufferRange> buffers)
|
public void SetTransformFeedbackBuffers(ReadOnlySpan<BufferRange> buffers)
|
||||||
{
|
{
|
||||||
PauseTransformFeedbackInternal();
|
PauseTransformFeedbackInternal();
|
||||||
|
|
Loading…
Reference in a new issue