Ver Fonte

fixed typo in vertex half vertex format (#818)

added missing texture formats
fixed packed depth/stencil format usage
attilaz há 9 anos atrás
pai
commit
7a76179273
2 ficheiros alterados com 46 adições e 13 exclusões
  1. 2 0
      src/renderer_mtl.h
  2. 44 13
      src/renderer_mtl.mm

+ 2 - 0
src/renderer_mtl.h

@@ -229,6 +229,8 @@ namespace bgfx { namespace mtl
 				);
 				);
 			return state;
 			return state;
 		}
 		}
+	
+		bool depth24Stencil8PixelFormatSupported() { return m_obj.depth24Stencil8PixelFormatSupported; }
 	MTL_CLASS_END
 	MTL_CLASS_END
 
 
 	MTL_CLASS(Function)
 	MTL_CLASS(Function)

+ 44 - 13
src/renderer_mtl.mm

@@ -17,10 +17,23 @@
 
 
 #import <Foundation/Foundation.h>
 #import <Foundation/Foundation.h>
 
 
-#define UNIFORM_BUFFER_SIZE (1024*1024)
+#define UNIFORM_BUFFER_SIZE (8*1024*1024)
 #define UNIFORM_BUFFER_COUNT (3)
 #define UNIFORM_BUFFER_COUNT (3)
 
 
 /*
 /*
+ //OSX issues:
+  03-raymarch: nothing is visible
+  12-lod: color differences
+  15-shadowmaps-simple: shader compilation error
+  16-shadowmaps: framebuffer creation problems
+  18-ibl:color wheel is not visible
+  19-oit: mrt independent does not work
+  20-nanovg: nothing is visible
+  21-deferred: only intermediate buffers are visible
+  22-windows: todo support multiple windows
+  26-occlusion: view 2's clear should clear only its rect (not while fb)
+  27-terrain: problem with sample in texture mode
+ 
 Known issues / TODOs:
 Known issues / TODOs:
 - 15-shadowmaps-simple (modified shaderc and example needs modification too, mtxCrop znew = z * 0.5 + 0.5 is not needed ) could be hacked in shader too
 - 15-shadowmaps-simple (modified shaderc and example needs modification too, mtxCrop znew = z * 0.5 + 0.5 is not needed ) could be hacked in shader too
 - 19-oit ( hacked shaderc to support MRT output)
 - 19-oit ( hacked shaderc to support MRT output)
@@ -142,8 +155,8 @@ namespace bgfx { namespace mtl
 		{
 		{
 			{ MTLVertexFormatHalf2, MTLVertexFormatHalf2 },
 			{ MTLVertexFormatHalf2, MTLVertexFormatHalf2 },
 			{ MTLVertexFormatHalf2, MTLVertexFormatHalf2 },
 			{ MTLVertexFormatHalf2, MTLVertexFormatHalf2 },
-			{ MTLVertexFormatHalf3, MTLVertexFormatHalf2 },
-			{ MTLVertexFormatHalf4, MTLVertexFormatHalf2 }
+			{ MTLVertexFormatHalf3, MTLVertexFormatHalf3 },
+			{ MTLVertexFormatHalf4, MTLVertexFormatHalf4 }
 		},
 		},
 
 
 		//Float
 		//Float
@@ -289,7 +302,11 @@ namespace bgfx { namespace mtl
 		{ MTLPixelFormatRG32Sint,                  MTLPixelFormatInvalid                        }, // RG32I
 		{ MTLPixelFormatRG32Sint,                  MTLPixelFormatInvalid                        }, // RG32I
 		{ MTLPixelFormatRG32Uint,                  MTLPixelFormatInvalid                        }, // RG32U
 		{ MTLPixelFormatRG32Uint,                  MTLPixelFormatInvalid                        }, // RG32U
 		{ MTLPixelFormatRG32Float,                 MTLPixelFormatInvalid                        }, // RG32F
 		{ MTLPixelFormatRG32Float,                 MTLPixelFormatInvalid                        }, // RG32F
-		{ MTLPixelFormatRGB9E5Float,               MTLPixelFormatInvalid                        }, // RGB9E5F
+        { MTLPixelFormatInvalid,                   MTLPixelFormatInvalid                        }, // RGB8
+        { MTLPixelFormatInvalid,                   MTLPixelFormatInvalid                        }, // RGB8I
+        { MTLPixelFormatInvalid,                   MTLPixelFormatInvalid                        }, // RGB8U
+		{ MTLPixelFormatInvalid,                   MTLPixelFormatInvalid                        }, // RGB8S
+        { MTLPixelFormatRGB9E5Float,               MTLPixelFormatInvalid                        }, // RGB9E5F
 		{ MTLPixelFormatBGRA8Unorm,                MTLPixelFormatBGRA8Unorm_sRGB                }, // BGRA8
 		{ MTLPixelFormatBGRA8Unorm,                MTLPixelFormatBGRA8Unorm_sRGB                }, // BGRA8
 		{ MTLPixelFormatRGBA8Unorm,                MTLPixelFormatRGBA8Unorm_sRGB                }, // RGBA8
 		{ MTLPixelFormatRGBA8Unorm,                MTLPixelFormatRGBA8Unorm_sRGB                }, // RGBA8
 		{ MTLPixelFormatRGBA8Sint,                 MTLPixelFormatInvalid                        }, // RGBA8I
 		{ MTLPixelFormatRGBA8Sint,                 MTLPixelFormatInvalid                        }, // RGBA8I
@@ -437,6 +454,11 @@ namespace bgfx { namespace mtl
 			}
 			}
 #	endif // __IPHONE_8_0
 #	endif // __IPHONE_8_0
 #endif // BX_PLATFORM_*
 #endif // BX_PLATFORM_*
+			
+
+#if BX_PLATFORM_OSX
+			s_textureFormat[TextureFormat::D24S8].m_fmt = m_device.depth24Stencil8PixelFormatSupported() ? MTLPixelFormatDepth24Unorm_Stencil8 : MTLPixelFormatDepth32Float_Stencil8;
+#endif
 
 
 			for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii)
 			for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii)
 			{
 			{
@@ -1109,6 +1131,9 @@ namespace bgfx { namespace mtl
 					const TextureMtl& texture = m_textures[frameBuffer.m_depthHandle.idx];
 					const TextureMtl& texture = m_textures[frameBuffer.m_depthHandle.idx];
 					renderPassDescriptor.depthAttachment.texture = texture.m_ptr;
 					renderPassDescriptor.depthAttachment.texture = texture.m_ptr;
 					renderPassDescriptor.stencilAttachment.texture = texture.m_ptrStencil;
 					renderPassDescriptor.stencilAttachment.texture = texture.m_ptrStencil;
+
+					if ( texture.m_textureFormat == TextureFormat::D24S8)
+						renderPassDescriptor.stencilAttachment.texture = texture.m_ptr;
 					//TODO: stencilAttachment should be the same if packed/depth stencil format is used
 					//TODO: stencilAttachment should be the same if packed/depth stencil format is used
 				}
 				}
 			}
 			}
@@ -1559,7 +1584,9 @@ namespace bgfx { namespace mtl
 					{
 					{
 						pd.stencilAttachmentPixelFormat = MTLPixelFormatInvalid; //texture.m_ptrStencil.m_obj.pixelFormat;
 						pd.stencilAttachmentPixelFormat = MTLPixelFormatInvalid; //texture.m_ptrStencil.m_obj.pixelFormat;
 					}
 					}
-					//todo: stencil attachment should be the same as depth for packed depth/stencil
+					
+					if ( texture.m_textureFormat == TextureFormat::D24S8)
+						pd.stencilAttachmentPixelFormat = texture.m_ptr.m_obj.pixelFormat; 
 				}
 				}
 			}
 			}
 
 
@@ -1889,8 +1916,8 @@ namespace bgfx { namespace mtl
 					 );
 					 );
 
 
 			const bool writeOnly   = 0 != (_flags&BGFX_TEXTURE_RT_WRITE_ONLY);
 			const bool writeOnly   = 0 != (_flags&BGFX_TEXTURE_RT_WRITE_ONLY);
-//			const bool computeWrite = 0 != (_flags&BGFX_TEXTURE_COMPUTE_WRITE);
-//			const bool renderTarget = 0 != (_flags&BGFX_TEXTURE_RT_MASK);
+			const bool computeWrite = 0 != (_flags&BGFX_TEXTURE_COMPUTE_WRITE);
+			const bool renderTarget = 0 != (_flags&BGFX_TEXTURE_RT_MASK);
 			const bool srgb			= 0 != (_flags&BGFX_TEXTURE_SRGB) || imageContainer.m_srgb;
 			const bool srgb			= 0 != (_flags&BGFX_TEXTURE_SRGB) || imageContainer.m_srgb;
 //			const uint32_t msaaQuality = bx::uint32_satsub( (_flags&BGFX_TEXTURE_RT_MSAA_MASK)>>BGFX_TEXTURE_RT_MSAA_SHIFT, 1);
 //			const uint32_t msaaQuality = bx::uint32_satsub( (_flags&BGFX_TEXTURE_RT_MSAA_MASK)>>BGFX_TEXTURE_RT_MSAA_SHIFT, 1);
 //			const DXGI_SAMPLE_DESC& msaa = s_msaa[msaaQuality];
 //			const DXGI_SAMPLE_DESC& msaa = s_msaa[msaaQuality];
@@ -1920,16 +1947,17 @@ namespace bgfx { namespace mtl
 			desc.resourceOptions  = MTLResourceStorageModePrivate;
 			desc.resourceOptions  = MTLResourceStorageModePrivate;
 			desc.cpuCacheMode     = MTLCPUCacheModeDefaultCache;
 			desc.cpuCacheMode     = MTLCPUCacheModeDefaultCache;
 
 
-			desc.storageMode = (MTLStorageMode)(writeOnly
+			//TODO: these flags works only on iOS9+/OSX
+			desc.storageMode = (MTLStorageMode)(writeOnly||isDepth(TextureFormat::Enum(m_textureFormat))
 				? 2 /*MTLStorageModePrivate*/
 				? 2 /*MTLStorageModePrivate*/
 				: 1 /*MTLStorageModeManaged*/
 				: 1 /*MTLStorageModeManaged*/
 				);
 				);
-			desc.usage       = writeOnly
-				? MTLTextureUsageShaderWrite
-				: MTLTextureUsageShaderRead
-				;
 
 
-			//TODO: set resource flags depending on usage(renderTarget/computeWrite/etc) on iOS9/OSX
+			desc.usage = MTLTextureUsageShaderRead;
+			if (computeWrite)
+				desc.usage |= MTLTextureUsageShaderWrite;
+			if (renderTarget)
+				desc.usage |= MTLTextureUsageRenderTarget;
 
 
 			m_ptr = s_renderMtl->m_device.newTextureWithDescriptor(desc);
 			m_ptr = s_renderMtl->m_device.newTextureWithDescriptor(desc);
 			if (m_requestedFormat == TextureFormat::D24S8
 			if (m_requestedFormat == TextureFormat::D24S8
@@ -2527,6 +2555,9 @@ namespace bgfx { namespace mtl
 						rc.y    = scissorRect.m_y;
 						rc.y    = scissorRect.m_y;
 						rc.width  = scissorRect.m_width;
 						rc.width  = scissorRect.m_width;
 						rc.height = scissorRect.m_height;
 						rc.height = scissorRect.m_height;
+						
+						if ( rc.width == 0 || rc.height == 0 )
+							continue;
 					}
 					}
 					rce.setScissorRect(rc);
 					rce.setScissorRect(rc);
 				}
 				}