This commit is contained in:
Branimir Karadžić 2015-10-06 15:27:54 -07:00
parent 2ec8cb802b
commit 154d2e7232
5 changed files with 134 additions and 132 deletions

View file

@ -305,9 +305,11 @@ function exampleProject(_name)
}
configuration { "osx" }
links {
"Cocoa.framework",
"OpenGL.framework",
linkoptions {
"-framework Cocoa",
"-framework Metal",
"-framework QuartzCore",
"-framework OpenGL",
}
configuration { "ios*" }

View file

@ -1621,6 +1621,13 @@ again:
}
else
{
#if 0
if (s_rendererCreator[RendererType::Metal].supported)
{
_type = RendererType::Metal;
}
else
#endif // 0
if (s_rendererCreator[RendererType::OpenGL].supported)
{
_type = RendererType::OpenGL;

View file

@ -41,10 +41,10 @@
? 1 : 0)
# endif // BGFX_CONFIG_RENDERER_DIRECT3D12
//TODO: should check if iOS8 or greater
# ifndef BGFX_CONFIG_RENDERER_METAL
# define BGFX_CONFIG_RENDERER_METAL (0 \
|| BX_PLATFORM_IOS \
|| BX_PLATFORM_OSX \
? 1 : 0)
# endif // BGFX_CONFIG_RENDERER_METAL

View file

@ -13,9 +13,9 @@
#import <QuartzCore/CAMetalLayer.h>
#import <Metal/Metal.h>
#ifdef BX_PLATFORM_IOS
#if BX_PLATFORM_IOS
# import <UIKit/UIKit.h>
#endif // BX_PLATFORM_IOS
#endif // BX_PLATFORM_*
namespace bgfx { namespace mtl
{
@ -265,10 +265,11 @@ namespace bgfx { namespace mtl
[_obj release]; \
_obj = nil;
#ifdef BX_PLATFORM_IOS
#if BX_PLATFORM_IOS
bool OsVersionEqualOrGreater(const char* _version) { return ([[[UIDevice currentDevice] systemVersion] compare:@(_version) options:NSNumericSearch] != NSOrderedAscending); }
//TODO: this could be in bx ?
#endif
#endif //
// end of c++ wrapper
template <typename Ty>

View file

@ -242,82 +242,80 @@ namespace bgfx { namespace mtl
MTLPixelFormat m_fmtSrgb;
};
//TODO: add new ios/osx formats
//TODO: add caps for format support
static TextureFormatInfo s_textureFormat[] =
{
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC1
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC2
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC3
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC4
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC5
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC6H
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC7
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // ETC1
{ MTLPixelFormatETC2_RGB8, MTLPixelFormatETC2_RGB8_sRGB }, // ETC2
{ MTLPixelFormatEAC_RGBA8, MTLPixelFormatEAC_RGBA8_sRGB }, // ETC2A
{ MTLPixelFormatETC2_RGB8A1, MTLPixelFormatETC2_RGB8A1_sRGB }, // ETC2A1
{ MTLPixelFormatPVRTC_RGB_2BPP, MTLPixelFormatPVRTC_RGB_2BPP_sRGB }, // PTC12
{ MTLPixelFormatPVRTC_RGB_4BPP, MTLPixelFormatPVRTC_RGB_4BPP_sRGB }, // PTC14
{ MTLPixelFormatPVRTC_RGBA_2BPP, MTLPixelFormatPVRTC_RGBA_2BPP_sRGB }, // PTC12A
{ MTLPixelFormatPVRTC_RGBA_4BPP, MTLPixelFormatPVRTC_RGBA_4BPP_sRGB }, // PTC14A
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // PTC22
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // PTC24
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // Unknown
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // R1
{ MTLPixelFormatA8Unorm, MTLPixelFormatInvalid }, // A8
{ MTLPixelFormatR8Unorm, MTLPixelFormatR8Unorm_sRGB }, // R8
{ MTLPixelFormatR8Sint, MTLPixelFormatInvalid }, // R8I
{ MTLPixelFormatR8Uint, MTLPixelFormatInvalid }, // R8U
{ MTLPixelFormatR8Snorm, MTLPixelFormatInvalid }, // R8S
{ MTLPixelFormatR16Unorm, MTLPixelFormatInvalid }, // R16
{ MTLPixelFormatR16Sint, MTLPixelFormatInvalid }, // R16I
{ MTLPixelFormatR16Uint, MTLPixelFormatInvalid }, // R16U
{ MTLPixelFormatR16Float, MTLPixelFormatInvalid }, // R16F
{ MTLPixelFormatR16Snorm, MTLPixelFormatInvalid }, // R16S
{ MTLPixelFormatR32Sint, MTLPixelFormatInvalid }, // R32I
{ MTLPixelFormatR32Uint, MTLPixelFormatInvalid }, // R32U
{ MTLPixelFormatR32Float, MTLPixelFormatInvalid }, // R32F
{ MTLPixelFormatRG8Unorm, MTLPixelFormatRG8Unorm_sRGB }, // RG8
{ MTLPixelFormatRG8Sint, MTLPixelFormatInvalid }, // RG8I
{ MTLPixelFormatRG8Uint, MTLPixelFormatInvalid }, // RG8U
{ MTLPixelFormatRG8Snorm, MTLPixelFormatInvalid }, // RG8S
{ MTLPixelFormatRG16Unorm, MTLPixelFormatInvalid }, // RG16
{ MTLPixelFormatRG16Sint, MTLPixelFormatInvalid }, // RG16I
{ MTLPixelFormatRG16Uint, MTLPixelFormatInvalid }, // RG16U
{ MTLPixelFormatRG16Float, MTLPixelFormatInvalid }, // RG16F
{ MTLPixelFormatRG16Snorm, MTLPixelFormatInvalid }, // RG16S
{ MTLPixelFormatRG32Sint, MTLPixelFormatInvalid }, // RG32I
{ MTLPixelFormatRG32Uint, MTLPixelFormatInvalid }, // RG32U
{ MTLPixelFormatRG32Float, MTLPixelFormatInvalid }, // RG32F
{ MTLPixelFormatRGB9E5Float, MTLPixelFormatInvalid }, // RGB9E5F
{ MTLPixelFormatBGRA8Unorm, MTLPixelFormatBGRA8Unorm_sRGB }, // BGRA8
{ MTLPixelFormatRGBA8Unorm, MTLPixelFormatRGBA8Unorm_sRGB }, // RGBA8
{ MTLPixelFormatRGBA8Sint, MTLPixelFormatInvalid }, // RGBA8I
{ MTLPixelFormatRGBA8Uint, MTLPixelFormatInvalid }, // RGBA8U
{ MTLPixelFormatRGBA8Snorm, MTLPixelFormatInvalid }, // RGBA8S
{ MTLPixelFormatRGBA16Unorm, MTLPixelFormatInvalid }, // RGBA16
{ MTLPixelFormatRGBA16Sint, MTLPixelFormatInvalid }, // RGBA16I
{ MTLPixelFormatRGBA16Uint, MTLPixelFormatInvalid }, // RGBA16I
{ MTLPixelFormatRGBA16Float, MTLPixelFormatInvalid }, // RGBA16F
{ MTLPixelFormatRGBA16Snorm, MTLPixelFormatInvalid }, // RGBA16S
{ MTLPixelFormatRGBA32Sint, MTLPixelFormatInvalid }, // RGBA32I
{ MTLPixelFormatRGBA32Uint, MTLPixelFormatInvalid }, // RGBA32U
{ MTLPixelFormatRGBA32Float, MTLPixelFormatInvalid }, // RGBA32F
{ MTLPixelFormatB5G6R5Unorm, MTLPixelFormatInvalid }, // R5G6B5
{ MTLPixelFormatABGR4Unorm, MTLPixelFormatInvalid }, // RGBA4
{ MTLPixelFormatA1BGR5Unorm, MTLPixelFormatInvalid }, // RGB5A1
{ MTLPixelFormatRGB10A2Unorm, MTLPixelFormatInvalid }, // RGB10A2
{ MTLPixelFormatRG11B10Float, MTLPixelFormatInvalid }, // R11G11B10F
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // UnknownDepth
{ MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D16
{ MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D24
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // D24S8
{ MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D32
{ MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D16F
{ MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D24F
{ MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D32F
{ MTLPixelFormatStencil8, MTLPixelFormatInvalid }, // D0S8
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC1
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC2
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC3
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC4
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC5
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC6H
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // BC7
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // ETC1
{ 180 /*MTLPixelFormatETC2_RGB8*/, 181 /*MTLPixelFormatETC2_RGB8_sRGB*/ }, // ETC2
{ 178 /*MTLPixelFormatEAC_RGBA8*/, 179 /*MTLPixelFormatEAC_RGBA8_sRGB*/ }, // ETC2A
{ 182 /*MTLPixelFormatETC2_RGB8A1*/, 183 /*MTLPixelFormatETC2_RGB8A1_sRGB*/ }, // ETC2A1
{ 160 /*MTLPixelFormatPVRTC_RGB_2BPP*/, 161 /*MTLPixelFormatPVRTC_RGB_2BPP_sRGB*/ }, // PTC12
{ 162 /*MTLPixelFormatPVRTC_RGB_4BPP*/, 163 /*MTLPixelFormatPVRTC_RGB_4BPP_sRGB*/ }, // PTC14
{ 164 /*MTLPixelFormatPVRTC_RGBA_2BPP*/, 165 /*MTLPixelFormatPVRTC_RGBA_2BPP_sRGB*/ }, // PTC12A
{ 166 /*MTLPixelFormatPVRTC_RGBA_4BPP*/, 167 /*MTLPixelFormatPVRTC_RGBA_4BPP_sRGB*/ }, // PTC14A
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // PTC22
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // PTC24
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // Unknown
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // R1
{ MTLPixelFormatA8Unorm, MTLPixelFormatInvalid }, // A8
{ MTLPixelFormatR8Unorm, 11 /*MTLPixelFormatR8Unorm_sRGB*/ }, // R8
{ MTLPixelFormatR8Sint, MTLPixelFormatInvalid }, // R8I
{ MTLPixelFormatR8Uint, MTLPixelFormatInvalid }, // R8U
{ MTLPixelFormatR8Snorm, MTLPixelFormatInvalid }, // R8S
{ MTLPixelFormatR16Unorm, MTLPixelFormatInvalid }, // R16
{ MTLPixelFormatR16Sint, MTLPixelFormatInvalid }, // R16I
{ MTLPixelFormatR16Uint, MTLPixelFormatInvalid }, // R16U
{ MTLPixelFormatR16Float, MTLPixelFormatInvalid }, // R16F
{ MTLPixelFormatR16Snorm, MTLPixelFormatInvalid }, // R16S
{ MTLPixelFormatR32Sint, MTLPixelFormatInvalid }, // R32I
{ MTLPixelFormatR32Uint, MTLPixelFormatInvalid }, // R32U
{ MTLPixelFormatR32Float, MTLPixelFormatInvalid }, // R32F
{ MTLPixelFormatRG8Unorm, 31 /*MTLPixelFormatRG8Unorm_sRGB*/ }, // RG8
{ MTLPixelFormatRG8Sint, MTLPixelFormatInvalid }, // RG8I
{ MTLPixelFormatRG8Uint, MTLPixelFormatInvalid }, // RG8U
{ MTLPixelFormatRG8Snorm, MTLPixelFormatInvalid }, // RG8S
{ MTLPixelFormatRG16Unorm, MTLPixelFormatInvalid }, // RG16
{ MTLPixelFormatRG16Sint, MTLPixelFormatInvalid }, // RG16I
{ MTLPixelFormatRG16Uint, MTLPixelFormatInvalid }, // RG16U
{ MTLPixelFormatRG16Float, MTLPixelFormatInvalid }, // RG16F
{ MTLPixelFormatRG16Snorm, MTLPixelFormatInvalid }, // RG16S
{ MTLPixelFormatRG32Sint, MTLPixelFormatInvalid }, // RG32I
{ MTLPixelFormatRG32Uint, MTLPixelFormatInvalid }, // RG32U
{ MTLPixelFormatRG32Float, MTLPixelFormatInvalid }, // RG32F
{ MTLPixelFormatRGB9E5Float, MTLPixelFormatInvalid }, // RGB9E5F
{ MTLPixelFormatBGRA8Unorm, MTLPixelFormatBGRA8Unorm_sRGB }, // BGRA8
{ MTLPixelFormatRGBA8Unorm, MTLPixelFormatRGBA8Unorm_sRGB }, // RGBA8
{ MTLPixelFormatRGBA8Sint, MTLPixelFormatInvalid }, // RGBA8I
{ MTLPixelFormatRGBA8Uint, MTLPixelFormatInvalid }, // RGBA8U
{ MTLPixelFormatRGBA8Snorm, MTLPixelFormatInvalid }, // RGBA8S
{ MTLPixelFormatRGBA16Unorm, MTLPixelFormatInvalid }, // RGBA16
{ MTLPixelFormatRGBA16Sint, MTLPixelFormatInvalid }, // RGBA16I
{ MTLPixelFormatRGBA16Uint, MTLPixelFormatInvalid }, // RGBA16I
{ MTLPixelFormatRGBA16Float, MTLPixelFormatInvalid }, // RGBA16F
{ MTLPixelFormatRGBA16Snorm, MTLPixelFormatInvalid }, // RGBA16S
{ MTLPixelFormatRGBA32Sint, MTLPixelFormatInvalid }, // RGBA32I
{ MTLPixelFormatRGBA32Uint, MTLPixelFormatInvalid }, // RGBA32U
{ MTLPixelFormatRGBA32Float, MTLPixelFormatInvalid }, // RGBA32F
{ 40 /*MTLPixelFormatB5G6R5Unorm*/, MTLPixelFormatInvalid }, // R5G6B5
{ 42 /*MTLPixelFormatABGR4Unorm*/, MTLPixelFormatInvalid }, // RGBA4
{ 41 /*MTLPixelFormatA1BGR5Unorm*/, MTLPixelFormatInvalid }, // RGB5A1
{ MTLPixelFormatRGB10A2Unorm, MTLPixelFormatInvalid }, // RGB10A2
{ MTLPixelFormatRG11B10Float, MTLPixelFormatInvalid }, // R11G11B10F
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // UnknownDepth
{ MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D16
{ MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D24
{ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, // D24S8
{ MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D32
{ MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D16F
{ MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D24F
{ MTLPixelFormatDepth32Float, MTLPixelFormatInvalid }, // D32F
{ MTLPixelFormatStencil8, MTLPixelFormatInvalid }, // D0S8
};
BX_STATIC_ASSERT(TextureFormat::Count == BX_COUNTOF(s_textureFormat) );
@ -343,7 +341,9 @@ namespace bgfx { namespace mtl
bool init()
{
if ( NSClassFromString(@"CAMetalLayer") != nil)
BX_TRACE("Init.");
if (NULL != NSClassFromString(@"CAMetalLayer") )
{
//on iOS we need the layer as CAmetalLayer
#if BX_PLATFORM_IOS
@ -371,7 +371,8 @@ namespace bgfx { namespace mtl
}
}
if (m_device==NULL || m_metalLayer==nil)
if (NULL == m_device
|| NULL == m_metalLayer)
{
BX_WARN(NULL != m_device, "Unable to create Metal device.");
return false;
@ -382,11 +383,11 @@ namespace bgfx { namespace mtl
m_commandQueue = m_device.newCommandQueue();
BGFX_FATAL(NULL != m_commandQueue, Fatal::UnableToInitialize, "Unable to create Metal device.");
m_renderPipelineDescriptor = newRenderPipelineDescriptor();
m_depthStencilDescriptor = newDepthStencilDescriptor();
m_renderPipelineDescriptor = newRenderPipelineDescriptor();
m_depthStencilDescriptor = newDepthStencilDescriptor();
m_frontFaceStencilDescriptor = newStencilDescriptor();
m_backFaceStencilDescriptor = newStencilDescriptor();
m_vertexDescriptor = newVertexDescriptor();
m_backFaceStencilDescriptor = newStencilDescriptor();
m_vertexDescriptor = newVertexDescriptor();
m_textureDescriptor = newTextureDescriptor();
m_samplerDescriptor = newSamplerDescriptor();
@ -401,7 +402,7 @@ namespace bgfx { namespace mtl
| BGFX_CAPS_TEXTURE_3D
| BGFX_CAPS_INSTANCING
| BGFX_CAPS_VERTEX_ATTRIB_HALF
// | BGFX_CAPS_FRAGMENT_DEPTH //TODO: is this supported?
// | BGFX_CAPS_FRAGMENT_DEPTH
| BGFX_CAPS_BLEND_INDEPENDENT
| BGFX_CAPS_COMPUTE
| BGFX_CAPS_INDEX32
@ -447,6 +448,7 @@ namespace bgfx { namespace mtl
bx::snprintf(s_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED+1, "%3d ", ii);
}
BX_TRACE("x");
return true;
}
@ -490,7 +492,6 @@ namespace bgfx { namespace mtl
return BGFX_RENDERER_METAL_NAME;
}
void createIndexBuffer(IndexBufferHandle _handle, Memory* _mem, uint16_t _flags) BX_OVERRIDE
{
m_indexBuffers[_handle.idx].create(_mem->size, _mem->data, _flags);
@ -837,34 +838,29 @@ namespace bgfx { namespace mtl
void updateResolution(const Resolution& _resolution)
{
if (!!(_resolution.m_flags & BGFX_RESET_MAXANISOTROPY) )
{
m_maxAnisotropy = 16;
}
else
{
m_maxAnisotropy = 1;
}
m_maxAnisotropy = !!(_resolution.m_flags & BGFX_RESET_MAXANISOTROPY)
? 16
: 1
;
//TODO: _resolution has wrong dimensions, using m_drawable.texture size now
if ( NULL == m_drawable.texture )
if (NULL == m_drawable.texture)
{
return;
}
uint32_t width = (uint32_t)m_drawable.texture.width;
uint32_t width = (uint32_t)m_drawable.texture.width;
uint32_t height = (uint32_t)m_drawable.texture.height;
//TODO: there should be a way to specify if backbuffer needs stencil/depth.
//TODO: support msaa
if ( NULL == m_backBufferDepth || width!=m_backBufferDepth.width() || height!=m_backBufferDepth.height())
if (NULL == m_backBufferDepth
|| width != m_backBufferDepth.width()
|| height != m_backBufferDepth.height() )
{
m_textureDescriptor.textureType = MTLTextureType2D;
#if BX_PLATFORM_IOS
m_textureDescriptor.pixelFormat = MTLPixelFormatDepth32Float;
#else
m_textureDescriptor.pixelFormat = MTLPixelFormatDepth32Float_Stencil8;
#endif // BX_PLATFORM_*
m_textureDescriptor.width = width;
m_textureDescriptor.height = height;
@ -874,25 +870,22 @@ namespace bgfx { namespace mtl
m_textureDescriptor.arrayLength = 1;
//m_textureDescriptor.resourceOptions = 0;
if ( NULL != m_backBufferDepth )
if (NULL != m_backBufferDepth)
{
release(m_backBufferDepth);
}
m_backBufferDepth = m_device.newTextureWithDescriptor(m_textureDescriptor);
#if BX_PLATFORM_IOS
m_textureDescriptor.pixelFormat = MTLPixelFormatStencil8;
m_textureDescriptor.width = width;
m_textureDescriptor.height = height;
if ( NULL != m_backBufferStencil )
if (NULL != m_backBufferStencil)
{
release(m_backBufferStencil);
}
m_backBufferStencil = m_device.newTextureWithDescriptor(m_textureDescriptor);
#else
m_backBufferStencil = m_backBufferDepth;
#endif // BX_PLATFORM_*
bx::HashMurmur2A murmur;
murmur.begin();
@ -1076,25 +1069,25 @@ namespace bgfx { namespace mtl
uint32_t frontAndBack = bstencil != BGFX_STENCIL_NONE && bstencil != fstencil;
bstencil = frontAndBack ? bstencil : fstencil;
if ( 0 != _stencil)
if (0 != _stencil)
{
StencilDescriptor frontFaceDesc = m_frontFaceStencilDescriptor;
StencilDescriptor backfaceDesc = m_backFaceStencilDescriptor;
uint32_t readMask = (fstencil&BGFX_STENCIL_FUNC_RMASK_MASK)>>BGFX_STENCIL_FUNC_RMASK_SHIFT;
uint32_t readMask = (fstencil&BGFX_STENCIL_FUNC_RMASK_MASK)>>BGFX_STENCIL_FUNC_RMASK_SHIFT;
uint32_t writeMask = 0xff;
frontFaceDesc.stencilFailureOperation = s_stencilOp[(fstencil&BGFX_STENCIL_OP_FAIL_S_MASK)>>BGFX_STENCIL_OP_FAIL_S_SHIFT];
frontFaceDesc.depthFailureOperation = s_stencilOp[(fstencil&BGFX_STENCIL_OP_FAIL_Z_MASK)>>BGFX_STENCIL_OP_FAIL_Z_SHIFT];
frontFaceDesc.stencilFailureOperation = s_stencilOp[(fstencil&BGFX_STENCIL_OP_FAIL_S_MASK)>>BGFX_STENCIL_OP_FAIL_S_SHIFT];
frontFaceDesc.depthFailureOperation = s_stencilOp[(fstencil&BGFX_STENCIL_OP_FAIL_Z_MASK)>>BGFX_STENCIL_OP_FAIL_Z_SHIFT];
frontFaceDesc.depthStencilPassOperation = s_stencilOp[(fstencil&BGFX_STENCIL_OP_PASS_Z_MASK)>>BGFX_STENCIL_OP_PASS_Z_SHIFT];
frontFaceDesc.stencilCompareFunction = s_cmpFunc[(fstencil&BGFX_STENCIL_TEST_MASK)>>BGFX_STENCIL_TEST_SHIFT];
frontFaceDesc.stencilCompareFunction = s_cmpFunc[(fstencil&BGFX_STENCIL_TEST_MASK)>>BGFX_STENCIL_TEST_SHIFT];
frontFaceDesc.readMask = readMask;
frontFaceDesc.writeMask = writeMask;
backfaceDesc.stencilFailureOperation = s_stencilOp[(bstencil&BGFX_STENCIL_OP_FAIL_S_MASK)>>BGFX_STENCIL_OP_FAIL_S_SHIFT];
backfaceDesc.depthFailureOperation = s_stencilOp[(bstencil&BGFX_STENCIL_OP_FAIL_Z_MASK)>>BGFX_STENCIL_OP_FAIL_Z_SHIFT];
backfaceDesc.stencilFailureOperation = s_stencilOp[(bstencil&BGFX_STENCIL_OP_FAIL_S_MASK)>>BGFX_STENCIL_OP_FAIL_S_SHIFT];
backfaceDesc.depthFailureOperation = s_stencilOp[(bstencil&BGFX_STENCIL_OP_FAIL_Z_MASK)>>BGFX_STENCIL_OP_FAIL_Z_SHIFT];
backfaceDesc.depthStencilPassOperation = s_stencilOp[(bstencil&BGFX_STENCIL_OP_PASS_Z_MASK)>>BGFX_STENCIL_OP_PASS_Z_SHIFT];
backfaceDesc.stencilCompareFunction = s_cmpFunc[(bstencil&BGFX_STENCIL_TEST_MASK)>>BGFX_STENCIL_TEST_SHIFT];
backfaceDesc.stencilCompareFunction = s_cmpFunc[(bstencil&BGFX_STENCIL_TEST_MASK)>>BGFX_STENCIL_TEST_SHIFT];
backfaceDesc.readMask = readMask;
backfaceDesc.writeMask = writeMask;
@ -1103,7 +1096,7 @@ namespace bgfx { namespace mtl
}
else
{
desc.backFaceStencil = NULL;
desc.backFaceStencil = NULL;
desc.frontFaceStencil = NULL;
}
@ -1134,8 +1127,8 @@ namespace bgfx { namespace mtl
m_samplerDescriptor.normalizedCoordinates = TRUE;
m_samplerDescriptor.maxAnisotropy = m_maxAnisotropy;
//TODO: I haven't found how to specify this. Comparison function can be specified in shader.
// On OSX this can be specified. There is no support for this on iOS right now.
//TODO: I haven't found how to specify this. Comparison function can be specified in shader.
// On OSX this can be specified. There is no support for this on iOS right now.
//const uint32_t cmpFunc = (_flags&BGFX_TEXTURE_COMPARE_MASK)>>BGFX_TEXTURE_COMPARE_SHIFT;
//const uint8_t filter = 0 == cmpFunc ? 0 : D3D11_COMPARISON_FILTERING_BIT;
//m_samplerDescriptor.comparisonFunc = 0 == cmpFunc ? D3D11_COMPARISON_NEVER : s_cmpFunc[cmpFunc];
@ -1157,8 +1150,6 @@ namespace bgfx { namespace mtl
return m_backBufferDepth.height();
}
Device m_device;
CommandQueue m_commandQueue;
CAMetalLayer* m_metalLayer;
@ -1606,12 +1597,12 @@ namespace bgfx { namespace mtl
if ( NULL != reflection )
{
for( int type =0; type<2; ++type)
for (uint32_t shaderType = 0; shaderType < 2; ++shaderType)
{
UniformBuffer*& constantBuffer = (type==0?m_vshConstantBuffer : m_fshConstantBuffer);
uint8_t fragmentBit = (1 == type ? BGFX_UNIFORM_FRAGMENTBIT : 0);
UniformBuffer*& constantBuffer = (shaderType == 0 ? m_vshConstantBuffer : m_fshConstantBuffer);
uint8_t fragmentBit = (1 == shaderType ? BGFX_UNIFORM_FRAGMENTBIT : 0);
for( MTLArgument* arg in (type==0?reflection.vertexArguments:reflection.fragmentArguments))
for( MTLArgument* arg in (shaderType == 0 ? reflection.vertexArguments : reflection.fragmentArguments))
{
BX_TRACE("arg: %s type:%d", utf8String(arg.name), arg.type);
if (arg.active)
@ -1623,7 +1614,7 @@ namespace bgfx { namespace mtl
if ( MTLDataTypeStruct == arg.bufferDataType )
{
if ( type == 0)
if (shaderType == 0)
{
m_vshConstantBufferSize = (uint32_t)arg.bufferDataSize;
m_vshConstantBufferAlignmentMask = (uint32_t)arg.bufferAlignment - 1;
@ -1642,7 +1633,7 @@ namespace bgfx { namespace mtl
MTLDataType dataType = uniform.dataType;
uint32_t num = 1;
if (dataType==MTLDataTypeArray)
if (dataType == MTLDataTypeArray)
{
dataType = uniform.arrayType.elementType;
num = (uint32_t)uniform.arrayType.arrayLength;
@ -1883,7 +1874,8 @@ namespace bgfx { namespace mtl
if ( compressed && !convert)
{
if ( format >= MTLPixelFormatPVRTC_RGB_2BPP && format <= MTLPixelFormatPVRTC_RGBA_4BPP_sRGB)
if (format >= 160 /*MTLPixelFormatPVRTC_RGB_2BPP*/
&& format <= 167 /*MTLPixelFormatPVRTC_RGBA_4BPP_sRGB*/)
{
bytesPerRow = 0;
bytesPerImage = 0;