Move support buffer update out of the backends (#5411)
* Move support buffer update out of the backends * Fix render scale init and remove redundant state from SupportBufferUpdater * Stop passing texture scale to the backends * XML docs for SupportBufferUpdater
This commit is contained in:
parent
fa32ef9275
commit
9c6071a645
51 changed files with 364 additions and 496 deletions
|
@ -35,7 +35,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
|
||||
private readonly bool[] _uniformSet;
|
||||
private readonly bool[] _storageSet;
|
||||
private Buffer _cachedSupportBuffer;
|
||||
|
||||
[Flags]
|
||||
private enum DirtyFlags
|
||||
|
@ -115,7 +114,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
SwizzleComponent.Red,
|
||||
SwizzleComponent.Green,
|
||||
SwizzleComponent.Blue,
|
||||
SwizzleComponent.Alpha), 1f);
|
||||
SwizzleComponent.Alpha));
|
||||
|
||||
_dummySampler = (SamplerHolder)gd.CreateSampler(new SamplerCreateInfo(
|
||||
MinFilter.Nearest,
|
||||
|
@ -392,26 +391,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
{
|
||||
Initialize(cbs, setIndex, dsc);
|
||||
}
|
||||
|
||||
if (setIndex == PipelineBase.UniformSetIndex)
|
||||
{
|
||||
Span<DescriptorBufferInfo> uniformBuffer = stackalloc DescriptorBufferInfo[1];
|
||||
|
||||
if (!_uniformSet[0])
|
||||
{
|
||||
_cachedSupportBuffer = _gd.BufferManager.GetBuffer(cbs.CommandBuffer, _pipeline.SupportBufferUpdater.Handle, false).Get(cbs, 0, SupportBuffer.RequiredSize).Value;
|
||||
_uniformSet[0] = true;
|
||||
}
|
||||
|
||||
uniformBuffer[0] = new DescriptorBufferInfo
|
||||
{
|
||||
Offset = 0,
|
||||
Range = (ulong)SupportBuffer.RequiredSize,
|
||||
Buffer = _cachedSupportBuffer,
|
||||
};
|
||||
|
||||
dsc.UpdateBuffers(0, 0, uniformBuffer, DescriptorType.UniformBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (ResourceBindingSegment segment in bindingSegments)
|
||||
|
@ -553,22 +532,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private void UpdateAndBindUniformBufferPd(CommandBufferScoped cbs, PipelineBindPoint pbp)
|
||||
{
|
||||
if (!_uniformSet[0])
|
||||
{
|
||||
Span<DescriptorBufferInfo> uniformBuffer = stackalloc DescriptorBufferInfo[1];
|
||||
|
||||
uniformBuffer[0] = new DescriptorBufferInfo
|
||||
{
|
||||
Offset = 0,
|
||||
Range = (ulong)SupportBuffer.RequiredSize,
|
||||
Buffer = _gd.BufferManager.GetBuffer(cbs.CommandBuffer, _pipeline.SupportBufferUpdater.Handle, false).Get(cbs, 0, SupportBuffer.RequiredSize).Value,
|
||||
};
|
||||
|
||||
_uniformSet[0] = true;
|
||||
|
||||
UpdateBuffers(cbs, pbp, 0, uniformBuffer, DescriptorType.UniformBuffer);
|
||||
}
|
||||
|
||||
var bindingSegments = _program.BindingSegments[PipelineBase.UniformSetIndex];
|
||||
var dummyBuffer = _dummyBuffer?.GetBuffer();
|
||||
|
||||
|
|
|
@ -115,7 +115,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
|
|||
originalInfo.SwizzleB,
|
||||
originalInfo.SwizzleA);
|
||||
_intermediaryTexture?.Dispose();
|
||||
_intermediaryTexture = _renderer.CreateTexture(info, view.ScaleFactor) as TextureView;
|
||||
_intermediaryTexture = _renderer.CreateTexture(info) as TextureView;
|
||||
}
|
||||
|
||||
_pipeline.SetCommandBuffer(cbs);
|
||||
|
|
|
@ -57,7 +57,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
|
|||
if (_texture == null || _texture.Width != view.Width || _texture.Height != view.Height)
|
||||
{
|
||||
_texture?.Dispose();
|
||||
_texture = _renderer.CreateTexture(view.Info, view.ScaleFactor) as TextureView;
|
||||
_texture = _renderer.CreateTexture(view.Info) as TextureView;
|
||||
}
|
||||
|
||||
_pipeline.SetCommandBuffer(cbs);
|
||||
|
|
|
@ -177,8 +177,8 @@ namespace Ryujinx.Graphics.Vulkan.Effects
|
|||
var areaTexture = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Textures/SmaaAreaTexture.bin");
|
||||
var searchTexture = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Textures/SmaaSearchTexture.bin");
|
||||
|
||||
_areaTexture = _renderer.CreateTexture(areaInfo, 1) as TextureView;
|
||||
_searchTexture = _renderer.CreateTexture(searchInfo, 1) as TextureView;
|
||||
_areaTexture = _renderer.CreateTexture(areaInfo) as TextureView;
|
||||
_searchTexture = _renderer.CreateTexture(searchInfo) as TextureView;
|
||||
|
||||
_areaTexture.SetData(areaTexture);
|
||||
_searchTexture.SetData(searchTexture);
|
||||
|
@ -193,9 +193,9 @@ namespace Ryujinx.Graphics.Vulkan.Effects
|
|||
_edgeOutputTexture?.Dispose();
|
||||
_blendOutputTexture?.Dispose();
|
||||
|
||||
_outputTexture = _renderer.CreateTexture(view.Info, view.ScaleFactor) as TextureView;
|
||||
_edgeOutputTexture = _renderer.CreateTexture(view.Info, view.ScaleFactor) as TextureView;
|
||||
_blendOutputTexture = _renderer.CreateTexture(view.Info, view.ScaleFactor) as TextureView;
|
||||
_outputTexture = _renderer.CreateTexture(view.Info) as TextureView;
|
||||
_edgeOutputTexture = _renderer.CreateTexture(view.Info) as TextureView;
|
||||
_blendOutputTexture = _renderer.CreateTexture(view.Info) as TextureView;
|
||||
}
|
||||
|
||||
_pipeline.SetCommandBuffer(cbs);
|
||||
|
|
|
@ -470,7 +470,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
_pipeline.ClearRenderTargetColor(0, 0, 1, new ColorF(0f, 0f, 0f, 1f));
|
||||
}
|
||||
|
||||
_pipeline.SetViewports(viewports, false);
|
||||
_pipeline.SetViewports(viewports);
|
||||
_pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip);
|
||||
_pipeline.Draw(4, 1, 0, 0);
|
||||
|
||||
|
@ -546,7 +546,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
|
||||
_pipeline.SetRenderTarget(dst, (uint)dstWidth, (uint)dstHeight, (uint)dstSamples, true, dstFormat);
|
||||
_pipeline.SetScissors(scissors);
|
||||
_pipeline.SetViewports(viewports, false);
|
||||
_pipeline.SetViewports(viewports);
|
||||
_pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip);
|
||||
|
||||
var aspectFlags = src.Info.Format.ConvertAspectFlags();
|
||||
|
@ -710,7 +710,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
_pipeline.SetProgram(program);
|
||||
_pipeline.SetRenderTarget(dst, (uint)dstWidth, (uint)dstHeight, false, dstFormat);
|
||||
_pipeline.SetRenderTargetColorMasks(new[] { componentMask });
|
||||
_pipeline.SetViewports(viewports, false);
|
||||
_pipeline.SetViewports(viewports);
|
||||
_pipeline.SetScissors(scissors);
|
||||
_pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip);
|
||||
_pipeline.Draw(4, 1, 0, 0);
|
||||
|
@ -774,7 +774,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
Span<Rectangle<int>> scissors = stackalloc Rectangle<int>[1];
|
||||
|
||||
pipeline.SetProgram(_programColorBlit);
|
||||
pipeline.SetViewports(viewports, false);
|
||||
pipeline.SetViewports(viewports);
|
||||
pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip);
|
||||
pipeline.Draw(4, 1, 0, 0);
|
||||
|
||||
|
@ -1117,7 +1117,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
scissors[0] = new Rectangle<int>(0, 0, dst.Width, dst.Height);
|
||||
|
||||
_pipeline.SetScissors(scissors);
|
||||
_pipeline.SetViewports(viewports, false);
|
||||
_pipeline.SetViewports(viewports);
|
||||
_pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip);
|
||||
|
||||
for (int z = 0; z < depth; z++)
|
||||
|
@ -1250,7 +1250,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
|
||||
_pipeline.SetRenderTargetColorMasks(new uint[] { 0xf });
|
||||
_pipeline.SetScissors(scissors);
|
||||
_pipeline.SetViewports(viewports, false);
|
||||
_pipeline.SetViewports(viewports);
|
||||
_pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip);
|
||||
|
||||
_pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(0, new BufferRange(bufferHandle, 0, ParamsBufferSize)) });
|
||||
|
|
|
@ -50,9 +50,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
|
||||
private ShaderCollection _program;
|
||||
|
||||
private readonly Vector4<float>[] _renderScale = new Vector4<float>[73];
|
||||
private int _fragmentScaleCount;
|
||||
|
||||
protected FramebufferParams FramebufferParams;
|
||||
private Auto<DisposableFramebuffer> _framebuffer;
|
||||
private Auto<DisposableRenderPass> _renderPass;
|
||||
|
@ -74,7 +71,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
|
||||
private readonly VertexBufferUpdater _vertexBufferUpdater;
|
||||
|
||||
public SupportBufferUpdater SupportBufferUpdater;
|
||||
public IndexBufferPattern QuadsToTrisPattern;
|
||||
public IndexBufferPattern TriFanToTrisPattern;
|
||||
|
||||
|
@ -119,9 +115,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
|
||||
ClearScissor = new Rectangle<int>(0, 0, 0xffff, 0xffff);
|
||||
|
||||
var defaultScale = new Vector4<float> { X = 1f, Y = 0f, Z = 0f, W = 0f };
|
||||
new Span<Vector4<float>>(_renderScale).Fill(defaultScale);
|
||||
|
||||
_storedBlend = new PipelineColorBlendAttachmentState[Constants.MaxRenderTargets];
|
||||
|
||||
_newState.Initialize();
|
||||
|
@ -131,9 +124,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
{
|
||||
_descriptorSetUpdater.Initialize();
|
||||
|
||||
SupportBufferUpdater = new SupportBufferUpdater(Gd);
|
||||
SupportBufferUpdater.UpdateRenderScale(_renderScale, 0, SupportBuffer.RenderScaleMaxCount);
|
||||
|
||||
QuadsToTrisPattern = new IndexBufferPattern(Gd, 4, 6, 0, new[] { 0, 1, 2, 0, 2, 3 }, 4, false);
|
||||
TriFanToTrisPattern = new IndexBufferPattern(Gd, 3, 3, 2, new[] { int.MinValue, -1, 0 }, 1, true);
|
||||
}
|
||||
|
@ -666,8 +656,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
{
|
||||
if (texture is TextureView srcTexture)
|
||||
{
|
||||
SupportBufferUpdater.Commit();
|
||||
|
||||
var oldCullMode = _newState.CullMode;
|
||||
var oldStencilTestEnable = _newState.StencilTestEnable;
|
||||
var oldDepthTestEnable = _newState.DepthTestEnable;
|
||||
|
@ -709,16 +697,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
_tfEnabled = false;
|
||||
}
|
||||
|
||||
public double GetCounterDivisor(CounterType type)
|
||||
{
|
||||
if (type == CounterType.SamplesPassed)
|
||||
{
|
||||
return _renderScale[0].X * _renderScale[0].X;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
public bool IsCommandBufferActive(CommandBuffer cb)
|
||||
{
|
||||
return CommandBuffer.Handle == cb.Handle;
|
||||
|
@ -1050,12 +1028,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
SetRenderTargetsInternal(colors, depthStencil, Gd.IsTBDR);
|
||||
}
|
||||
|
||||
public void SetRenderTargetScale(float scale)
|
||||
{
|
||||
_renderScale[0].X = scale;
|
||||
SupportBufferUpdater.UpdateRenderScale(_renderScale, 0, 1); // Just the first element.
|
||||
}
|
||||
|
||||
public void SetScissors(ReadOnlySpan<Rectangle<int>> regions)
|
||||
{
|
||||
int maxScissors = Gd.Capabilities.SupportsMultiView ? Constants.MaxViewports : 1;
|
||||
|
@ -1303,7 +1275,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
SignalStateChange();
|
||||
}
|
||||
|
||||
public void SetViewports(ReadOnlySpan<Viewport> viewports, bool disableTransform)
|
||||
public void SetViewports(ReadOnlySpan<Viewport> viewports)
|
||||
{
|
||||
int maxViewports = Gd.Capabilities.SupportsMultiView ? Constants.MaxViewports : 1;
|
||||
int count = Math.Min(maxViewports, viewports.Length);
|
||||
|
@ -1328,19 +1300,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
Clamp(viewport.DepthFar)));
|
||||
}
|
||||
|
||||
float disableTransformF = disableTransform ? 1.0f : 0.0f;
|
||||
if (SupportBufferUpdater.Data.ViewportInverse.W != disableTransformF || disableTransform)
|
||||
{
|
||||
float scale = _renderScale[0].X;
|
||||
SupportBufferUpdater.UpdateViewportInverse(new Vector4<float>
|
||||
{
|
||||
X = scale * 2f / viewports[0].Region.Width,
|
||||
Y = scale * 2f / viewports[0].Region.Height,
|
||||
Z = 1,
|
||||
W = disableTransformF,
|
||||
});
|
||||
}
|
||||
|
||||
_newState.ViewportsCount = (uint)count;
|
||||
SignalStateChange();
|
||||
}
|
||||
|
@ -1391,32 +1350,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
TextureBarrier();
|
||||
}
|
||||
|
||||
public void UpdateRenderScale(ReadOnlySpan<float> scales, int totalCount, int fragmentCount)
|
||||
{
|
||||
bool changed = false;
|
||||
|
||||
for (int index = 0; index < totalCount; index++)
|
||||
{
|
||||
if (_renderScale[1 + index].X != scales[index])
|
||||
{
|
||||
_renderScale[1 + index].X = scales[index];
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Only update fragment count if there are scales after it for the vertex stage.
|
||||
if (fragmentCount != totalCount && fragmentCount != _fragmentScaleCount)
|
||||
{
|
||||
_fragmentScaleCount = fragmentCount;
|
||||
SupportBufferUpdater.UpdateFragmentRenderScaleCount(_fragmentScaleCount);
|
||||
}
|
||||
|
||||
if (changed)
|
||||
{
|
||||
SupportBufferUpdater.UpdateRenderScale(_renderScale, 0, 1 + totalCount);
|
||||
}
|
||||
}
|
||||
|
||||
protected void SignalCommandBufferChange()
|
||||
{
|
||||
_needsIndexBufferRebind = true;
|
||||
|
@ -1614,9 +1547,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
|
||||
DynamicState.ReplayIfDirty(Gd.Api, CommandBuffer);
|
||||
|
||||
// Commit changes to the support buffer before drawing.
|
||||
SupportBufferUpdater.Commit();
|
||||
|
||||
if (_needsIndexBufferRebind && _indexBufferPattern == null)
|
||||
{
|
||||
_indexBuffer.BindIndexBuffer(Gd, Cbs);
|
||||
|
@ -1777,8 +1707,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
{
|
||||
Gd.Api.DestroyPipelineCache(Device, PipelineCache, null);
|
||||
}
|
||||
|
||||
SupportBufferUpdater.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -130,7 +130,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries
|
|||
}
|
||||
}
|
||||
|
||||
public CounterQueueEvent QueueReport(EventHandler<ulong> resultHandler, ulong lastDrawIndex, bool hostReserved)
|
||||
public CounterQueueEvent QueueReport(EventHandler<ulong> resultHandler, float divisor, ulong lastDrawIndex, bool hostReserved)
|
||||
{
|
||||
CounterQueueEvent result;
|
||||
ulong draws = lastDrawIndex - _current.DrawIndex;
|
||||
|
@ -146,7 +146,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries
|
|||
_current.ReserveForHostAccess();
|
||||
}
|
||||
|
||||
_current.Complete(draws > 0 && Type != CounterType.TransformFeedbackPrimitivesWritten, _pipeline.GetCounterDivisor(Type));
|
||||
_current.Complete(draws > 0 && Type != CounterType.TransformFeedbackPrimitivesWritten, divisor);
|
||||
_events.Enqueue(_current);
|
||||
|
||||
_current.OnResult += resultHandler;
|
||||
|
|
|
@ -37,9 +37,9 @@ namespace Ryujinx.Graphics.Vulkan.Queries
|
|||
_counterQueues[(int)CounterType.SamplesPassed].ResetFutureCounters(cmd, count);
|
||||
}
|
||||
|
||||
public CounterQueueEvent QueueReport(CounterType type, EventHandler<ulong> resultHandler, bool hostReserved)
|
||||
public CounterQueueEvent QueueReport(CounterType type, EventHandler<ulong> resultHandler, float divisor, bool hostReserved)
|
||||
{
|
||||
return _counterQueues[(int)type].QueueReport(resultHandler, _pipeline.DrawCount, hostReserved);
|
||||
return _counterQueues[(int)type].QueueReport(resultHandler, divisor, _pipeline.DrawCount, hostReserved);
|
||||
}
|
||||
|
||||
public void QueueReset(CounterType type)
|
||||
|
|
|
@ -25,15 +25,12 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
|
||||
public VkFormat VkFormat { get; }
|
||||
|
||||
public float ScaleFactor { get; }
|
||||
|
||||
public TextureBuffer(VulkanRenderer gd, TextureCreateInfo info, float scale)
|
||||
public TextureBuffer(VulkanRenderer gd, TextureCreateInfo info)
|
||||
{
|
||||
_gd = gd;
|
||||
Width = info.Width;
|
||||
Height = info.Height;
|
||||
VkFormat = FormatTable.GetFormat(info.Format);
|
||||
ScaleFactor = scale;
|
||||
|
||||
gd.Textures.Add(this);
|
||||
}
|
||||
|
|
|
@ -54,19 +54,16 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
private readonly ulong _size;
|
||||
|
||||
public VkFormat VkFormat { get; }
|
||||
public float ScaleFactor { get; }
|
||||
|
||||
public unsafe TextureStorage(
|
||||
VulkanRenderer gd,
|
||||
Device device,
|
||||
TextureCreateInfo info,
|
||||
float scaleFactor,
|
||||
Auto<MemoryAllocation> foreignAllocation = null)
|
||||
{
|
||||
_gd = gd;
|
||||
_device = device;
|
||||
_info = info;
|
||||
ScaleFactor = scaleFactor;
|
||||
|
||||
var format = _gd.FormatCapabilities.ConvertToVkFormat(info.Format);
|
||||
var levels = (uint)info.Levels;
|
||||
|
@ -175,7 +172,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
|
||||
var info = NewCreateInfoWith(ref _info, format, _info.BytesPerPixel);
|
||||
|
||||
storage = new TextureStorage(_gd, _device, info, ScaleFactor, _allocationAuto);
|
||||
storage = new TextureStorage(_gd, _device, info, _allocationAuto);
|
||||
|
||||
_aliasedStorages.Add(format, storage);
|
||||
}
|
||||
|
|
|
@ -32,7 +32,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
public int Layers => Info.GetDepthOrLayers();
|
||||
public int FirstLayer { get; }
|
||||
public int FirstLevel { get; }
|
||||
public float ScaleFactor => Storage.ScaleFactor;
|
||||
public VkFormat VkFormat { get; }
|
||||
public bool Valid { get; private set; }
|
||||
|
||||
|
|
|
@ -432,26 +432,26 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
return new SamplerHolder(this, _device, info);
|
||||
}
|
||||
|
||||
public ITexture CreateTexture(TextureCreateInfo info, float scale)
|
||||
public ITexture CreateTexture(TextureCreateInfo info)
|
||||
{
|
||||
if (info.Target == Target.TextureBuffer)
|
||||
{
|
||||
return new TextureBuffer(this, info, scale);
|
||||
return new TextureBuffer(this, info);
|
||||
}
|
||||
|
||||
return CreateTextureView(info, scale);
|
||||
return CreateTextureView(info);
|
||||
}
|
||||
|
||||
internal TextureView CreateTextureView(TextureCreateInfo info, float scale)
|
||||
internal TextureView CreateTextureView(TextureCreateInfo info)
|
||||
{
|
||||
// This should be disposed when all views are destroyed.
|
||||
var storage = CreateTextureStorage(info, scale);
|
||||
var storage = CreateTextureStorage(info);
|
||||
return storage.CreateView(info, 0, 0);
|
||||
}
|
||||
|
||||
internal TextureStorage CreateTextureStorage(TextureCreateInfo info, float scale)
|
||||
internal TextureStorage CreateTextureStorage(TextureCreateInfo info)
|
||||
{
|
||||
return new TextureStorage(this, _device, info, scale);
|
||||
return new TextureStorage(this, _device, info);
|
||||
}
|
||||
|
||||
public void DeleteBuffer(BufferHandle buffer)
|
||||
|
@ -753,9 +753,9 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
SyncManager.Cleanup();
|
||||
}
|
||||
|
||||
public ICounterEvent ReportCounter(CounterType type, EventHandler<ulong> resultHandler, bool hostReserved)
|
||||
public ICounterEvent ReportCounter(CounterType type, EventHandler<ulong> resultHandler, float divisor, bool hostReserved)
|
||||
{
|
||||
return _counters.QueueReport(type, resultHandler, hostReserved);
|
||||
return _counters.QueueReport(type, resultHandler, divisor, hostReserved);
|
||||
}
|
||||
|
||||
public void ResetCounter(CounterType type)
|
||||
|
|
|
@ -294,12 +294,11 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
}
|
||||
|
||||
int srcX0, srcX1, srcY0, srcY1;
|
||||
float scale = view.ScaleFactor;
|
||||
|
||||
if (crop.Left == 0 && crop.Right == 0)
|
||||
{
|
||||
srcX0 = 0;
|
||||
srcX1 = (int)(view.Width / scale);
|
||||
srcX1 = view.Width;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -310,7 +309,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
if (crop.Top == 0 && crop.Bottom == 0)
|
||||
{
|
||||
srcY0 = 0;
|
||||
srcY1 = (int)(view.Height / scale);
|
||||
srcY1 = view.Height;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -318,14 +317,6 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
srcY1 = crop.Bottom;
|
||||
}
|
||||
|
||||
if (scale != 1f)
|
||||
{
|
||||
srcX0 = (int)(srcX0 * scale);
|
||||
srcY0 = (int)(srcY0 * scale);
|
||||
srcX1 = (int)Math.Ceiling(srcX1 * scale);
|
||||
srcY1 = (int)Math.Ceiling(srcY1 * scale);
|
||||
}
|
||||
|
||||
if (ScreenCaptureRequested)
|
||||
{
|
||||
if (_effect != null)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue