Implement HLE macros for render target clears (#3528)
* Implement HLE macros for render target clears * Add constants for the offsets
This commit is contained in:
parent
c48a75979f
commit
1080f64df9
16 changed files with 149 additions and 43 deletions
|
@ -149,14 +149,14 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
return texture is TextureView view && view.Valid;
|
||||
}
|
||||
|
||||
public ClearRect GetClearRect(Rectangle<int> scissor, int layer)
|
||||
public ClearRect GetClearRect(Rectangle<int> scissor, int layer, int layerCount)
|
||||
{
|
||||
int x = scissor.X;
|
||||
int y = scissor.Y;
|
||||
int width = Math.Min((int)Width - scissor.X, scissor.Width);
|
||||
int height = Math.Min((int)Height - scissor.Y, scissor.Height);
|
||||
|
||||
return new ClearRect(new Rect2D(new Offset2D(x, y), new Extent2D((uint)width, (uint)height)), (uint)layer, 1);
|
||||
return new ClearRect(new Rect2D(new Offset2D(x, y), new Extent2D((uint)width, (uint)height)), (uint)layer, (uint)layerCount);
|
||||
}
|
||||
|
||||
public unsafe Auto<DisposableFramebuffer> Create(Vk api, CommandBufferScoped cbs, Auto<DisposableRenderPass> renderPass)
|
||||
|
|
|
@ -157,7 +157,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
|
||||
if (clearAlpha)
|
||||
{
|
||||
_pipeline.ClearRenderTargetColor(0, 0, new ColorF(0f, 0f, 0f, 1f));
|
||||
_pipeline.ClearRenderTargetColor(0, 0, 1, new ColorF(0f, 0f, 0f, 1f));
|
||||
}
|
||||
|
||||
_pipeline.SetViewports(viewports, false);
|
||||
|
|
|
@ -162,7 +162,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
size);
|
||||
}
|
||||
|
||||
public unsafe void ClearRenderTargetColor(int index, int layer, ColorF color)
|
||||
public unsafe void ClearRenderTargetColor(int index, int layer, int layerCount, ColorF color)
|
||||
{
|
||||
if (FramebufferParams == null || !FramebufferParams.IsValidColorAttachment(index))
|
||||
{
|
||||
|
@ -178,12 +178,12 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
|
||||
var clearValue = new ClearValue(new ClearColorValue(color.Red, color.Green, color.Blue, color.Alpha));
|
||||
var attachment = new ClearAttachment(ImageAspectFlags.ImageAspectColorBit, (uint)index, clearValue);
|
||||
var clearRect = FramebufferParams?.GetClearRect(ClearScissor, layer) ?? default;
|
||||
var clearRect = FramebufferParams.GetClearRect(ClearScissor, layer, layerCount);
|
||||
|
||||
Gd.Api.CmdClearAttachments(CommandBuffer, 1, &attachment, 1, &clearRect);
|
||||
}
|
||||
|
||||
public unsafe void ClearRenderTargetDepthStencil(int layer, float depthValue, bool depthMask, int stencilValue, int stencilMask)
|
||||
public unsafe void ClearRenderTargetDepthStencil(int layer, int layerCount, float depthValue, bool depthMask, int stencilValue, int stencilMask)
|
||||
{
|
||||
// TODO: Use stencilMask (fully)
|
||||
|
||||
|
@ -208,7 +208,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
}
|
||||
|
||||
var attachment = new ClearAttachment(flags, 0, clearValue);
|
||||
var clearRect = FramebufferParams?.GetClearRect(ClearScissor, layer) ?? default;
|
||||
var clearRect = FramebufferParams.GetClearRect(ClearScissor, layer, layerCount);
|
||||
|
||||
Gd.Api.CmdClearAttachments(CommandBuffer, 1, &attachment, 1, &clearRect);
|
||||
}
|
||||
|
|
|
@ -49,7 +49,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
_pendingQueryCopies.Clear();
|
||||
}
|
||||
|
||||
public void ClearRenderTargetColor(int index, int layer, uint componentMask, ColorF color)
|
||||
public void ClearRenderTargetColor(int index, int layer, int layerCount, uint componentMask, ColorF color)
|
||||
{
|
||||
if (FramebufferParams == null)
|
||||
{
|
||||
|
@ -85,7 +85,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
}
|
||||
else
|
||||
{
|
||||
ClearRenderTargetColor(index, layer, color);
|
||||
ClearRenderTargetColor(index, layer, layerCount, color);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue