From 25eef9dddb3e011d5bacd5135ab136a1fc71c2e5 Mon Sep 17 00:00:00 2001 From: Ben Doherty Date: Mon, 25 Mar 2019 14:41:22 -0700 Subject: [PATCH] Implement mipmap generation for Metal backends (#1035) --- filament/backend/src/metal/MetalDriver.mm | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/filament/backend/src/metal/MetalDriver.mm b/filament/backend/src/metal/MetalDriver.mm index f0091c75cc..26aa30395f 100644 --- a/filament/backend/src/metal/MetalDriver.mm +++ b/filament/backend/src/metal/MetalDriver.mm @@ -380,11 +380,23 @@ void MetalDriver::setExternalStream(Handle th, Handle sh) { } void MetalDriver::generateMipmaps(Handle th) { - + // @autoreleasepool is used to release the one-off command buffer and encoder in case this work + // is done outside a frame. + @autoreleasepool { + auto tex = handle_cast(mHandleMap, th); + // Create a one-off command buffer to execute the blit command. Technically, we could re-use + // this command buffer for later rendering commands, but we'll just commit it here for + // simplicity. + id commandBuffer = [mContext->commandQueue commandBuffer]; + id blitEncoder = [commandBuffer blitCommandEncoder]; + [blitEncoder generateMipmapsForTexture:tex->texture]; + [blitEncoder endEncoding]; + [commandBuffer commit]; + } } bool MetalDriver::canGenerateMipmaps() { - return false; + return true; } void MetalDriver::updateUniformBuffer(Handle ubh, @@ -575,6 +587,7 @@ void MetalDriver::blit(TargetBufferFlags buffers, Handle dst, driver::Viewport dstRect, Handle src, driver::Viewport srcRect, SamplerMagFilter filter) { + ASSERT_POSTCONDITION(false, "Blitting not implemented."); } void MetalDriver::draw(driver::PipelineState ps, Handle rph) {