rt(mtl): fix faulty history but only copying one mipmap slice of texture
rt(mtl): push history before doing writing This does make the metal backend one frame behind compared to the other stuff but eh
This commit is contained in:
parent
fe48fd03a5
commit
cebc7a939a
|
@ -27,7 +27,7 @@ use librashader_runtime::quad::QuadType;
|
|||
use librashader_runtime::render_target::RenderTarget;
|
||||
use librashader_runtime::scaling::ScaleFramebuffer;
|
||||
use librashader_runtime::uniforms::UniformStorage;
|
||||
use objc2::rc::Id;
|
||||
use objc2::rc::{Id, Retained};
|
||||
use objc2::runtime::ProtocolObject;
|
||||
use objc2_foundation::NSString;
|
||||
use objc2_metal::{
|
||||
|
@ -204,8 +204,8 @@ impl FilterChainMetal {
|
|||
|
||||
fn push_history(
|
||||
&mut self,
|
||||
input: &ProtocolObject<dyn MTLTexture>,
|
||||
cmd: &ProtocolObject<dyn MTLCommandBuffer>,
|
||||
input: &ProtocolObject<dyn MTLTexture>,
|
||||
) -> error::Result<()> {
|
||||
let mipmapper = cmd
|
||||
.blitCommandEncoder()
|
||||
|
@ -227,10 +227,11 @@ impl FilterChainMetal {
|
|||
}
|
||||
|
||||
back.copy_from(&mipmapper, input)?;
|
||||
|
||||
self.history_framebuffers.push_front(back);
|
||||
}
|
||||
mipmapper.endEncoding();
|
||||
self.history_framebuffers.push_front(back);
|
||||
} else {
|
||||
mipmapper.endEncoding();
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -326,20 +327,7 @@ impl FilterChainMetal {
|
|||
options: Option<&FrameOptionsMetal>,
|
||||
) -> error::Result<()> {
|
||||
let max = std::cmp::min(self.passes.len(), self.common.config.passes_enabled());
|
||||
let passes = &mut self.passes[0..max];
|
||||
if let Some(options) = &options {
|
||||
let desc = unsafe {
|
||||
let desc = MTLRenderPassDescriptor::new();
|
||||
desc.colorAttachments()
|
||||
.objectAtIndexedSubscript(0)
|
||||
.setLoadAction(MTLLoadAction::Clear);
|
||||
|
||||
desc.colorAttachments()
|
||||
.objectAtIndexedSubscript(0)
|
||||
.setStoreAction(MTLStoreAction::DontCare);
|
||||
desc
|
||||
};
|
||||
|
||||
let clear_desc = unsafe { MTLRenderPassDescriptor::new() };
|
||||
if options.clear_history {
|
||||
for (index, history) in self.history_framebuffers.iter().enumerate() {
|
||||
|
@ -352,13 +340,17 @@ impl FilterChainMetal {
|
|||
ca.setStoreAction(MTLStoreAction::Store);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let clearpass = cmd
|
||||
.renderCommandEncoderWithDescriptor(&desc)
|
||||
.renderCommandEncoderWithDescriptor(&clear_desc)
|
||||
.ok_or(FilterChainError::FailedToCreateCommandBuffer)?;
|
||||
clearpass.endEncoding();
|
||||
}
|
||||
}
|
||||
|
||||
self.push_history(&cmd, &input)?;
|
||||
|
||||
let passes = &mut self.passes[0..max];
|
||||
if passes.is_empty() {
|
||||
return Ok(());
|
||||
}
|
||||
|
@ -482,7 +474,6 @@ impl FilterChainMetal {
|
|||
)?;
|
||||
}
|
||||
|
||||
self.push_history(&input, &cmd)?;
|
||||
self.common.internal_frame_count = self.common.internal_frame_count.wrapping_add(1);
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -28,5 +28,5 @@ fn select_optimal_pixel_format(format: MTLPixelFormat) -> MTLPixelFormat {
|
|||
if format == MTLPixelFormat::RGBA8Unorm_sRGB {
|
||||
return MTLPixelFormat::BGRA8Unorm_sRGB;
|
||||
}
|
||||
return format;
|
||||
format
|
||||
}
|
||||
|
|
|
@ -70,11 +70,11 @@ impl OwnedTexture {
|
|||
1
|
||||
});
|
||||
|
||||
descriptor.setStorageMode(MTLStorageMode::Private);
|
||||
descriptor.setUsage(
|
||||
MTLTextureUsage::ShaderRead
|
||||
| MTLTextureUsage::ShaderWrite
|
||||
| MTLTextureUsage::RenderTarget,
|
||||
| MTLTextureUsage::RenderTarget
|
||||
| MTLTextureUsage::PixelFormatView,
|
||||
);
|
||||
|
||||
descriptor
|
||||
|
@ -106,7 +106,7 @@ impl OwnedTexture {
|
|||
|| (!mipmap && self.max_miplevels != 1)
|
||||
|| format != select_optimal_pixel_format(format)
|
||||
{
|
||||
let mut new = OwnedTexture::new(device, size, self.max_miplevels, format)?;
|
||||
let mut new = OwnedTexture::new(device, size, self.max_miplevels, select_optimal_pixel_format(format))?;
|
||||
std::mem::swap(self, &mut new);
|
||||
}
|
||||
Ok(size)
|
||||
|
|
Loading…
Reference in a new issue