Making v2-1-pso work on OSX

Discussion area about developing with Ogre-Next (2.1, 2.2 and beyond)


Post Reply
johughes
Gnoblar
Posts: 12
Joined: Thu Aug 25, 2016 7:33 pm

Making v2-1-pso work on OSX

Post by johughes »

Decided I would try to get the v2-1-pso branch working on OSX. Managed to get pretty far!

Currently stuck with an exception being thrown in MetalRenderSystem::_hlmsPipelineStateObjectCreated()

The call to [mActiveDevice->mDevice newRenderPipelineStateWithDescriptor:psd error:&error] results in an error:
Vertex attribute 15 is not defined in the vertex descriptor.
I can see further up in _hlmsPipelineStateObjectCreated() where it fills in the vertexDescriptor.attributes[], it does not set anything in slot 15.

Is there a missing call to bindDrawId()? Or how should that be done with the PSO approach?
User avatar
dark_sylinc
OGRE Team Member
OGRE Team Member
Posts: 5296
Joined: Sat Jul 21, 2007 4:55 pm
Location: Buenos Aires, Argentina
x 1278
Contact:

Re: Making v2-1-pso work on OSX

Post by dark_sylinc »

Hi!

I updated the 2.1 FAQ yesterday regarding OS X support. As it says, we've never tested OS X yet (iOS works though). David (our OSX maintainer) was going to start testing it.

I'm interested in knowing how it goes (I don't own a Metal-capable Mac). Probably what's missing are a few minor bug fixes, and most notably an NSView implementation to replace UIView on OSX. As a I told David yesterday:
I wrote "OgreMetalView" which derives from UIView
on OSX it should derive from NSView
and problem done
probably have its own header and mm file

Code: Select all

#if IOS
#import "iOS/OgreMetalView.h"
#else
#import "OSX/OgreMetalView.h"
#endif
Thanks for the report! I've fixed it already. Let me know how it goes :)

Cheers
mrmclovin
Gnome
Posts: 324
Joined: Sun May 11, 2008 9:27 pm
x 20

Re: Making v2-1-pso work on OSX

Post by mrmclovin »

johughes wrote:Decided I would try to get the v2-1-pso branch working on OSX. Managed to get pretty far!

Currently stuck with an exception being thrown in MetalRenderSystem::_hlmsPipelineStateObjectCreated()

The call to [mActiveDevice->mDevice newRenderPipelineStateWithDescriptor:psd error:&error] results in an error:
Vertex attribute 15 is not defined in the vertex descriptor.
I can see further up in _hlmsPipelineStateObjectCreated() where it fills in the vertexDescriptor.attributes[], it does not set anything in slot 15.

Is there a missing call to bindDrawId()? Or how should that be done with the PSO approach?
I'm also interested in getting it to work on my OSX machine. If you want some help this weekend I'll be able to help. Write here or send me a PM, if so! :)
User avatar
dark_sylinc
OGRE Team Member
OGRE Team Member
Posts: 5296
Joined: Sat Jul 21, 2007 4:55 pm
Location: Buenos Aires, Argentina
x 1278
Contact:

Re: Making v2-1-pso work on OSX

Post by dark_sylinc »

Just try to compile it / try to run it and inform me what errors you encounter!

If you manage to compile it, begin by running the samples (in this order; if one fails, try to go to the next one just in case it manages to work):
  • Sample_Tutorial01_Initialization
  • Sample_Tutorial02_VariableFramerate
  • Sample_Tutorial03_DeterministicLoop
  • Sample_StereoRendering
  • Sample_ShadowMapDebugging
  • Sample_PbsMaterials
  • Sample_TutorialSky_Postprocess
  • Sample_Postprocessing
Once those are running, pretty much every other sample should run and can be tried in any random order.
Though the lack of NSView is probably going to prevent you from successfully launching the samples. We could use NSView directly, but it would be nice if SDL2 can also be used there (given that it provides keyboard & mouse support). It has to be a very recent SDL2 version though.
johughes
Gnoblar
Posts: 12
Joined: Thu Aug 25, 2016 7:33 pm

Re: Making v2-1-pso work on OSX

Post by johughes »

I pushed up my ogre fork here: https://github.com/jondo2010/ogre/commits/fix_osx

It contains some CMake hacks to disable building the samples and libs into bundles, which seems to be broken, and I'd prefer not to do anyways.

I've also written (not very well) an NSView based OgreMetalView class for OSX in a seperate file to the iOS version. I had never touch obj-c before this. The differences between iOS and OSX might be so slight that a single file with preprocessor blocks might be easier to maintain. I used this as an example: https://developer.apple.com/library/pre ... ementID_11

With the latest commits from yesterday, I get this failed assertion when running Sample_Tutorial02: /Library/Caches/com.apple.xbs/Sources/Metal/Metal-56.6.1/Framework/MTLVertexDescriptor.mm:672: failed assertion `Vertex attribute at index 15 references a buffer at index 15 that has no stride.'

Code: Select all

*-*-* OGRE Initialising
*-*-* Version 2.1.0unstable (Tindalos)
CPU Identifier & Features
-------------------------
 *   CPU ID: GenuineIntel: Intel(R) Core(TM) i7-4980HQ CPU @ 2.80GHz
 *   Logical cores: 8
 *      SSE: yes
 *     SSE2: yes
 *     SSE3: yes
 *      MMX: yes
 *   MMXEXT: yes
 *    3DNOW: no
 * 3DNOWEXT: no
 *     CMOV: yes
 *      TSC: yes
 *      FPU: yes
 *      PRO: yes
 *       HT: no
-------------------------
Supports: OSX_GPUFamily1_v1
Registering ResourceManager for type GpuProgram
Registering ResourceManager for type Texture
DefaultWorkQueue('Root') initialising on thread 0x7fff7a3ca000.
DefaultWorkQueue('Root')::WorkerFunc - thread 0x70000019a000 starting.
DefaultWorkQueue('Root')::WorkerFunc - thread 0x70000021d000 starting.
DefaultWorkQueue('Root')::WorkerFunc - thread 0x7000003a6000 starting.
DefaultWorkQueue('Root')::WorkerFunc - thread 0x7000005b2000 starting.
DefaultWorkQueue('Root')::WorkerFunc - thread 0x700000635000 starting.
DefaultWorkQueue('Root')::WorkerFunc - thread 0x7000006b8000 starting.
DefaultWorkQueue('Root')::WorkerFunc - thread 0x70000073b000 starting.
DefaultWorkQueue('Root')::WorkerFunc - thread 0x7000007be000 starting.
MetalHardwarePixelBuffer constructed for texture Hlms_Blanktexture face 0 level 0: width=4 height=4 depth=1 format=PF_R8G8B8A8 MTLformat=28
MetalTextureBuffer::upload:  pixel buffer: 0 bytes: 64 dest depth: 1 dest front: 0 bytesPerImage: 64 face: 0 level: 0 width: 4 height: 4 depth: 1 format: PF_R8G8B8A8 data format: PF_R8G8B8A8
Particle Renderer Type 'billboard' registered
OverlayElementFactory for type Panel registered.
OverlayElementFactory for type BorderPanel registered.
OverlayElementFactory for type TextArea registered.
Registering ResourceManager for type Font
Creating resource group Essential
Added resource location '/Users/johughes/OtherRepos/ogre-git/Samples/Media/packs/DebugPack.zip' of type 'Zip' to resource group 'Essential'
Creating resource group Popular
Added resource location '/Users/johughes/OtherRepos/ogre-git/Samples/Media/2.0/scripts/Compositors' of type 'FileSystem' to resource group 'Popular'
Added resource location '/Users/johughes/OtherRepos/ogre-git/Samples/Media/models' of type 'FileSystem' to resource group 'Popular'
Added resource location './textures' of type 'FileSystem' to resource group 'Popular'
Added resource location './textures/Cubemaps' of type 'FileSystem' to resource group 'Popular'
Parsing scripts for resource group Autodetect
Finished parsing scripts for resource group Autodetect
Creating resources for group Autodetect
All done
Parsing scripts for resource group Essential
Parsing script Materials.material
Parsing script DebugFont.fontdef
Finished parsing scripts for resource group Essential
Creating resources for group Essential
All done
Parsing scripts for resource group General
Finished parsing scripts for resource group General
Creating resources for group General
All done
Parsing scripts for resource group Internal
Finished parsing scripts for resource group Internal
Creating resources for group Internal
All done
Parsing scripts for resource group Popular
Parsing script PbsMaterials.compositor
Parsing script ShadowMapDebugging.compositor
Parsing script StencilTest.compositor
Parsing script StereoRendering.compositor
Parsing script Tutorial_DynamicCubemap.compositor
Parsing script Tutorial_ReconstructPosFromDepth.compositor
Parsing script Tutorial_Terrain.compositor
Parsing script TutorialSky_Postprocess.compositor
Parsing script TutorialUav01_Setup.compositor
Parsing script TutorialUav02_Setup.compositor
Finished parsing scripts for resource group Popular
Creating resources for group Popular
All done
Mesh: Loading Cube_d.mesh.
WARNING: Cube_d.mesh is an older format ([MeshSerializer_v2.1 R1]); you should upgrade it as soon as possible using the OgreMeshTool tool.
Font DebugFont using texture size 512x256
Info: Freetype returned null for character 160 in font DebugFont
MetalHardwarePixelBuffer constructed for texture DebugFontTexture face 0 level 0: width=512 height=256 depth=1 format=PF_RG8 MTLformat=79
Texture: DebugFontTexture: Loading 1 faces(PF_RG8,512x256x1) Internal format is PF_RG8,512x256x1.
MetalTextureBuffer::upload:  pixel buffer: 0 bytes: 262144 dest depth: 1 dest front: 0 bytesPerImage: 262144 face: 0 level: 0 width: 512 height: 256 depth: 1 format: PF_RG8 data format: PF_RG8
Shader 536870912VertexShader_vs compiled successfully.
Shader 536870912PixelShader_ps compiled successfully.
/Library/Caches/com.apple.xbs/Sources/Metal/Metal-56.6.1/Framework/MTLVertexDescriptor.mm:672: failed assertion `Vertex attribute at index 15 references a buffer at index 15 that has no stride.'
[1]    91694 abort      ./Sample_Tutorial02_VariableFramerate
User avatar
dark_sylinc
OGRE Team Member
OGRE Team Member
Posts: 5296
Joined: Sat Jul 21, 2007 4:55 pm
Location: Buenos Aires, Argentina
x 1278
Contact:

Re: Making v2-1-pso work on OSX

Post by dark_sylinc »

johughes wrote: With the latest commits from yesterday, I get this failed assertion when running Sample_Tutorial02: /Library/Caches/com.apple.xbs/Sources/Metal/Metal-56.6.1/Framework/MTLVertexDescriptor.mm:672: failed assertion `Vertex attribute at index 15 references a buffer at index 15 that has no stride.'
Ooops. Fixed. Thanks.
johughes
Gnoblar
Posts: 12
Joined: Thu Aug 25, 2016 7:33 pm

Re: Making v2-1-pso work on OSX

Post by johughes »

Thanks for the prompt fixes!

I now have things to the point of no longer crashing, however nothing is rendered in the window.

Stepping through the code, I can see that in MetalRenderWindow::nextDrawable(void):
1. The CAMetalDrawable returned by [mMetalLayer nextDrawable] is valid
2. But it appears as though the 'texture' property on the CAMetalDrawable is invalid.

I've checked that the pixelFormat is correct (MTLPixelFormatBGRA8Unorm)

Not sure what is going on here.
User avatar
dark_sylinc
OGRE Team Member
OGRE Team Member
Posts: 5296
Joined: Sat Jul 21, 2007 4:55 pm
Location: Buenos Aires, Argentina
x 1278
Contact:

Re: Making v2-1-pso work on OSX

Post by dark_sylinc »

I don't know much either.
But I see you're doing "[CAMetalLayer alloc]" whereas I've seen others doing "[CAMetalLayer layer]" instead. Perhaps that's the problem.

Btw do you get a blue-ish background? (that's our clear colour in most of our samples). Is there anything in the Ogre.log?
johughes
Gnoblar
Posts: 12
Joined: Thu Aug 25, 2016 7:33 pm

Re: Making v2-1-pso work on OSX

Post by johughes »

Progress:

Got the clear and overlay passes to work!

Had to pass the SDL-created NSView pointer into the MetalRenderWindow::create and attach the OgreMetalView to the parent window. I also had to wrap the code in MetalRenderWindow::nextDrawable() in an @autoreleasepool block, otherwise the drawables weren't getting released.

I'm not seeing the scene rendered, however. Not getting any warnings or errors.

I pushed up all my changes to my git repo, linked above.

Code: Select all

Mesh: Loading Cube_d.mesh.
WARNING: Cube_d.mesh is an older format ([MeshSerializer_v2.1 R1]); you should upgrade it as soon as possible using the OgreMeshTool tool.
Font DebugFont using texture size 512x256
Info: Freetype returned null for character 160 in font DebugFont
MetalHardwarePixelBuffer constructed for texture DebugFontTexture face 0 level 0: width=512 height=256 depth=1 format=PF_RG8 MTLformat=79
Texture: DebugFontTexture: Loading 1 faces(PF_RG8,512x256x1) Internal format is PF_RG8,512x256x1.
MetalTextureBuffer::upload:  pixel buffer: 0 bytes: 262144 dest depth: 1 dest front: 0 bytesPerImage: 262144 face: 0 level: 0 width: 512 height: 256 depth: 1 format: PF_RG8 data format: PF_RG8
Shader 536870912VertexShader_vs compiled successfully.
Shader 536870912PixelShader_ps compiled successfully.
Shader 1610612739VertexShader_vs compiled successfully.
Shader 1610612739PixelShader_ps compiled successfully.
Attachments
Screen Shot 2016-09-15 at 11.32.08 AM.png
User avatar
dark_sylinc
OGRE Team Member
OGRE Team Member
Posts: 5296
Joined: Sat Jul 21, 2007 4:55 pm
Location: Buenos Aires, Argentina
x 1278
Contact:

Re: Making v2-1-pso work on OSX

Post by dark_sylinc »

You got it to work with SDL? :o
That's awesome!

Nice picture!!!

It's obviously missing the cube. Unfortunately I can't ask you for the Graphics Debugger capture because even then I won't be able to run it (mmm... I wonder? Maybe I can?).

I suspect something wrong with the drawId buffer binding, or with matrix buffer.

I'll ask you to try the following:
Find Samples/Media/Hlms/Pbs/Metal/VertexShader_vs.metal; line 28:

Code: Select all

ushort drawId [[attribute(15)]]
Change ushort for uint. You may have perform a cast a little downwards:

Code: Select all

ushort drawId = (ushort)input.drawId;
Honestly I don't think that will fix it, but it's worth a try.

Second:
Go to RenderSystems/Metal/src/Vao/OgreMetalVaoManager.mm line 114:

Code: Select all

//Keep pools of 128MB for static buffers
mDefaultPoolSize[CPU_INACCESSIBLE]  = 128 * 1024 * 1024;

//Keep pools of 32MB each for dynamic buffers
for( size_t i=CPU_ACCESSIBLE_DEFAULT; i<=CPU_ACCESSIBLE_PERSISTENT_COHERENT; ++i )
    mDefaultPoolSize[i] = 32 * 1024 * 1024;
Change them for:

Code: Select all

//Keep pools of 128MB for static buffers
mDefaultPoolSize[CPU_INACCESSIBLE]  = 32;

//Keep pools of 32MB each for dynamic buffers
for( size_t i=CPU_ACCESSIBLE_DEFAULT; i<=CPU_ACCESSIBLE_PERSISTENT_COHERENT; ++i )
    mDefaultPoolSize[i] = 32;
Then take a GPU Debugger Capture; export it to a file and send it to me via PM. Maybe it works on my machine and I can see what's going on. (this change won't fix anything, it just makes it easier to debug)
johughes
Gnoblar
Posts: 12
Joined: Thu Aug 25, 2016 7:33 pm

Re: Making v2-1-pso work on OSX

Post by johughes »

Tried the shader changes with no luck. And unfortunately it appears that the GPU trace function is iOS only.
User avatar
dark_sylinc
OGRE Team Member
OGRE Team Member
Posts: 5296
Joined: Sat Jul 21, 2007 4:55 pm
Location: Buenos Aires, Argentina
x 1278
Contact:

Re: Making v2-1-pso work on OSX

Post by dark_sylinc »

*sigh*
I had heard the Graphics Debugger is coming to OS X. Seems it's going to be in XCode 8. We're so close to getting 2.1 run on OSX...

Without the debugger I can't tell what's going wrong. I'll try to think about it to see if I remember something that could tells us where to look. I'm sure it's something very stupid (like all the other bugs so far)
johughes
Gnoblar
Posts: 12
Joined: Thu Aug 25, 2016 7:33 pm

Re: Making v2-1-pso work on OSX

Post by johughes »

On another note, I figured I'd try to clean up my CMake hacks.

Currently when I ask CMake to generate an XCode project, I can run the resulting Sample*.app/ bundles from the IDE, but when I try to run from the command line, I see that Ogre frameworks are dynamically linked with e.g.

Code: Select all

@executable_path/../Frameworks/OgreOverlay.framework/Versions/2.1.0/OgreOverlay
Should the build system have made a symlink of the Ogre .frameworks into the application bundle?
User avatar
dark_sylinc
OGRE Team Member
OGRE Team Member
Posts: 5296
Joined: Sat Jul 21, 2007 4:55 pm
Location: Buenos Aires, Argentina
x 1278
Contact:

Re: Making v2-1-pso work on OSX

Post by dark_sylinc »

The CMake option OGRE_STATIC controls whether we use dynamic or static linking. If you're saying the dynamic .so would've been bundled with the app, then I didn't know and the scripts would have to be slightly modified to account this.
johughes
Gnoblar
Posts: 12
Joined: Thu Aug 25, 2016 7:33 pm

Clues!

Post by johughes »

I figured out how to get XCode to run with Metal debugging, which enables some extra assertions in the API.

1st clue, at OgreMetalStagingBuffer.mm:217:

Code: Select all

/Library/Caches/com.apple.xbs/Sources/Metal/Metal-56.6.1/ToolsLayers/Debug/MTLDebugBuffer.mm:163: failed assertion `didModifyRange: only applies when resourceOptions(0x1) & MTLResourceStorageModeMask(0xf0) == MTLResourceStorageModeManaged(0x10).  NOT MTLResourceStorageModeShared'
Fix (I think): I modified MetalVaoManager::createStagingBuffer() to create the MTLBuffer using the flag MTLResourceStorageModeManaged on OSX instead of MTLResourceStorageModeShared.

2nd clue, at OgreMetalRenderSystem.mm:912

Code: Select all

/Library/Caches/com.apple.xbs/Sources/Metal/Metal-56.6.1/ToolsLayers/Debug/MTLDebugCommandBuffer.mm:346: failed assertion `When depth and stencil are used together, the texture bound to the depth and stencil framebuffer attachments must be the same depth and stencil texture.'
Not sure about this one.
User avatar
dark_sylinc
OGRE Team Member
OGRE Team Member
Posts: 5296
Joined: Sat Jul 21, 2007 4:55 pm
Location: Buenos Aires, Argentina
x 1278
Contact:

Re: Making v2-1-pso work on OSX

Post by dark_sylinc »

Thanks! I might be able to take a look during the weekend.

Edit: Got a few seconds, realized what the Metal error meant. Fixed. Check again (I didn't look at the StagingBuffer issue yet)
johughes
Gnoblar
Posts: 12
Joined: Thu Aug 25, 2016 7:33 pm

Re: Making v2-1-pso work on OSX

Post by johughes »

Spent some time in the debugger and figured out the issue.

The OSX implementation of the MetalVaoManager constructor sets mSupportsIndirectBuffers = true, which eventually leads to MetalRenderSystem::_render( const CbDrawCallIndexed *cmd ) getting called (not-yet-implemented stub function) instead of MetalRenderSystem::_renderEmulated( const CbDrawCallIndexed *cmd ).
Attachments
Screen Shot 2016-09-19 at 6.57.21 AM.png
User avatar
dark_sylinc
OGRE Team Member
OGRE Team Member
Posts: 5296
Joined: Sat Jul 21, 2007 4:55 pm
Location: Buenos Aires, Argentina
x 1278
Contact:

Re: Making v2-1-pso work on OSX

Post by dark_sylinc »

Whoa! That's amazing!

I hadn't taken a look at your capture yet, but I would probably been dazled. Nice job spotting the problem!
I completely forgot those render calls were stubs.

I guess I should write them when I get some spare time. How's the rest of the samples doing with your little change? (btw what GPU do you have?)
johughes
Gnoblar
Posts: 12
Joined: Thu Aug 25, 2016 7:33 pm

Re: Making v2-1-pso work on OSX

Post by johughes »

My 15" Macbook Pro has an AMD Radeon R9 M370X 2048 MB

SaintPetersBasilica.dds doesn't load in any examples that use it, it raises an exception in MetalTextureBuffer::upload() because width is 2048 and rowPitch is 4096.

I've attached the Ogre.log from a debug build of Sample_PbsMaterials (with the reflection map disabled)
Attachments
Ogre.log
(46.28 KiB) Downloaded 274 times
User avatar
dark_sylinc
OGRE Team Member
OGRE Team Member
Posts: 5296
Joined: Sat Jul 21, 2007 4:55 pm
Location: Buenos Aires, Argentina
x 1278
Contact:

Re: Making v2-1-pso work on OSX

Post by dark_sylinc »

Wow! Thanks!

Can you post the error message metal says when loading the basilica texture? (Exact words)
TBH I want to see a clue on what Metal expects (my guesses either row pitch should be 512, 1024 or 0)
johughes
Gnoblar
Posts: 12
Joined: Thu Aug 25, 2016 7:33 pm

Re: Making v2-1-pso work on OSX

Post by johughes »

This exception gets raised:

OgreMetalPixelBuffer.mm:314

Code: Select all

OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
                        "Unsupported texture format",
                        "MetalTextureBuffer::upload");
User avatar
dark_sylinc
OGRE Team Member
OGRE Team Member
Posts: 5296
Joined: Sat Jul 21, 2007 4:55 pm
Location: Buenos Aires, Argentina
x 1278
Contact:

Re: Making v2-1-pso work on OSX

Post by dark_sylinc »

I meant there should be a Metal error in the XCode log when running with Metal validation layer.
User avatar
dark_sylinc
OGRE Team Member
OGRE Team Member
Posts: 5296
Joined: Sat Jul 21, 2007 4:55 pm
Location: Buenos Aires, Argentina
x 1278
Contact:

Re: Making v2-1-pso work on OSX

Post by dark_sylinc »

OH I see what you mean. Apologies.

If you comment that out, does it work?
johughes
Gnoblar
Posts: 12
Joined: Thu Aug 25, 2016 7:33 pm

Re: Making v2-1-pso work on OSX

Post by johughes »

Yes, if I comment out the loading of SaintPetersBasilica.dds then the program loads and runs as expected.

It looks like it's able to generate all the mipmap levels on the CPU side, but that exception is raised in MetalTextureBuffer::upload()

Code: Select all

Texture: loading SaintPetersBasilica.dds as SaintPetersBasilica.dds
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 0 level 0: width=2048 height=2048 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 0 level 1: width=1024 height=1024 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 0 level 2: width=512 height=512 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 0 level 3: width=256 height=256 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 0 level 4: width=128 height=128 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 0 level 5: width=64 height=64 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 0 level 6: width=32 height=32 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 0 level 7: width=16 height=16 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 0 level 8: width=8 height=8 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 0 level 9: width=4 height=4 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 0 level 10: width=2 height=2 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 0 level 11: width=1 height=1 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 1 level 0: width=2048 height=2048 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 1 level 1: width=1024 height=1024 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 1 level 2: width=512 height=512 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 1 level 3: width=256 height=256 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 1 level 4: width=128 height=128 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 1 level 5: width=64 height=64 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 1 level 6: width=32 height=32 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 1 level 7: width=16 height=16 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 1 level 8: width=8 height=8 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 1 level 9: width=4 height=4 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 1 level 10: width=2 height=2 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 1 level 11: width=1 height=1 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 2 level 0: width=2048 height=2048 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 2 level 1: width=1024 height=1024 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 2 level 2: width=512 height=512 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 2 level 3: width=256 height=256 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 2 level 4: width=128 height=128 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 2 level 5: width=64 height=64 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 2 level 6: width=32 height=32 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 2 level 7: width=16 height=16 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 2 level 8: width=8 height=8 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 2 level 9: width=4 height=4 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 2 level 10: width=2 height=2 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 2 level 11: width=1 height=1 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 3 level 0: width=2048 height=2048 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 3 level 1: width=1024 height=1024 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 3 level 2: width=512 height=512 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 3 level 3: width=256 height=256 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 3 level 4: width=128 height=128 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 3 level 5: width=64 height=64 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 3 level 6: width=32 height=32 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 3 level 7: width=16 height=16 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 3 level 8: width=8 height=8 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 3 level 9: width=4 height=4 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 3 level 10: width=2 height=2 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 3 level 11: width=1 height=1 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 4 level 0: width=2048 height=2048 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 4 level 1: width=1024 height=1024 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 4 level 2: width=512 height=512 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 4 level 3: width=256 height=256 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 4 level 4: width=128 height=128 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 4 level 5: width=64 height=64 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 4 level 6: width=32 height=32 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 4 level 7: width=16 height=16 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 4 level 8: width=8 height=8 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 4 level 9: width=4 height=4 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 4 level 10: width=2 height=2 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 4 level 11: width=1 height=1 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 5 level 0: width=2048 height=2048 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 5 level 1: width=1024 height=1024 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 5 level 2: width=512 height=512 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 5 level 3: width=256 height=256 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 5 level 4: width=128 height=128 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 5 level 5: width=64 height=64 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 5 level 6: width=32 height=32 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 5 level 7: width=16 height=16 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 5 level 8: width=8 height=8 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 5 level 9: width=4 height=4 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 5 level 10: width=2 height=2 depth=1 format=PF_DXT1 MTLformat=17
MetalHardwarePixelBuffer constructed for texture HlmsTextureManager/9 face 5 level 11: width=1 height=1 depth=1 format=PF_DXT1 MTLformat=17
<Exception raised>
Post Reply