|
|
@@ -94,7 +94,7 @@ namespace bgfx { namespace mtl
|
|
|
"LineStrip",
|
|
|
"Point",
|
|
|
};
|
|
|
- BX_STATIC_ASSERT(BX_COUNTOF(s_primInfo) == BX_COUNTOF(s_primName));
|
|
|
+ BX_STATIC_ASSERT(BX_COUNTOF(s_primInfo) == BX_COUNTOF(s_primName) );
|
|
|
|
|
|
static const char* s_attribName[] =
|
|
|
{
|
|
|
@@ -457,7 +457,7 @@ namespace bgfx { namespace mtl
|
|
|
const char* fshSource = "using namespace metal; \n"
|
|
|
" struct xlatMtlShaderInput { float2 v_texcoord0; }; \n"
|
|
|
" fragment half4 xlatMtlMain (xlatMtlShaderInput _mtl_i[[stage_in]], texture2d<float> s_texColor [[texture(0)]], sampler _mtlsmp_s_texColor [[sampler(0)]] ) \n"
|
|
|
- " { return half4(s_texColor.sample(_mtlsmp_s_texColor, _mtl_i.v_texcoord0)); } \n";
|
|
|
+ " { return half4(s_texColor.sample(_mtlsmp_s_texColor, _mtl_i.v_texcoord0) ); } \n";
|
|
|
|
|
|
Library lib = m_device.newLibraryWithSource(vshSource);
|
|
|
if (NULL != lib)
|
|
|
@@ -486,9 +486,7 @@ namespace bgfx { namespace mtl
|
|
|
| BGFX_CAPS_INSTANCING
|
|
|
| BGFX_CAPS_FRAGMENT_DEPTH
|
|
|
| BGFX_CAPS_BLEND_INDEPENDENT
|
|
|
-// | BGFX_CAPS_COMPUTE // TODO: api/hw supports it but metal compute shaders are not yet supported
|
|
|
| BGFX_CAPS_INDEX32
|
|
|
-// | BGFX_CAPS_DRAW_INDIRECT // TODO: support on iOS9+gpu family3+ and on macOS
|
|
|
| BGFX_CAPS_TEXTURE_BLIT
|
|
|
| BGFX_CAPS_TEXTURE_READ_BACK
|
|
|
| BGFX_CAPS_OCCLUSION_QUERY
|
|
|
@@ -500,14 +498,14 @@ namespace bgfx { namespace mtl
|
|
|
{
|
|
|
if (iOSVersionEqualOrGreater("9.0.0") )
|
|
|
{
|
|
|
- g_caps.limits.maxTextureSize = m_device.supportsFeatureSet((MTLFeatureSet)4 /* iOS_GPUFamily3_v1 */) ? 16384 : 8192;
|
|
|
+ g_caps.limits.maxTextureSize = m_device.supportsFeatureSet( (MTLFeatureSet)4 /* iOS_GPUFamily3_v1 */) ? 16384 : 8192;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
g_caps.limits.maxTextureSize = 4096;
|
|
|
}
|
|
|
|
|
|
- g_caps.limits.maxFBAttachments = uint8_t(bx::uint32_min(m_device.supportsFeatureSet((MTLFeatureSet)1 /* MTLFeatureSet_iOS_GPUFamily2_v1 */) ? 8 : 4, BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS));
|
|
|
+ g_caps.limits.maxFBAttachments = uint8_t(bx::uint32_min(m_device.supportsFeatureSet( (MTLFeatureSet)1 /* MTLFeatureSet_iOS_GPUFamily2_v1 */) ? 8 : 4, BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS) );
|
|
|
}
|
|
|
else if (BX_ENABLED(BX_PLATFORM_OSX) )
|
|
|
{
|
|
|
@@ -559,13 +557,12 @@ namespace bgfx { namespace mtl
|
|
|
|
|
|
if (!bimg::isCompressed(bimg::TextureFormat::Enum(ii) ) )
|
|
|
{
|
|
|
- support |= BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER
|
|
|
- | BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA;
|
|
|
+ support |= 0
|
|
|
+ | BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER
|
|
|
+ | BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA
|
|
|
+ ;
|
|
|
}
|
|
|
|
|
|
- //TODO: additional caps flags
|
|
|
-// support |= BGFX_CAPS_FORMAT_TEXTURE_IMAGE : BGFX_CAPS_FORMAT_TEXTURE_NONE;
|
|
|
-
|
|
|
g_caps.formats[ii] = support;
|
|
|
}
|
|
|
|
|
|
@@ -623,7 +620,7 @@ namespace bgfx { namespace mtl
|
|
|
|
|
|
for(uint32_t ii=1; ii<5; ++ii)
|
|
|
{
|
|
|
- if (!m_device.supportsTextureSampleCount(s_msaa[ii]))
|
|
|
+ if (!m_device.supportsTextureSampleCount(s_msaa[ii]) )
|
|
|
{
|
|
|
s_msaa[ii] = s_msaa[ii-1];
|
|
|
}
|
|
|
@@ -1092,22 +1089,6 @@ namespace bgfx { namespace mtl
|
|
|
|
|
|
m_cmd.kick(true);
|
|
|
m_commandBuffer = 0;
|
|
|
-
|
|
|
- //TODO: support multiple windows on OSX
|
|
|
- /*
|
|
|
- if (m_flip)
|
|
|
- {
|
|
|
- for (uint32_t ii = 1, num = m_numWindows; ii < num; ++ii)
|
|
|
- {
|
|
|
- m_glctx.swap(m_frameBuffers[m_windows[ii].idx].m_swapChain);
|
|
|
- }
|
|
|
-
|
|
|
- if (!m_ovr.swap(_hmd) )
|
|
|
- {
|
|
|
- m_glctx.swap();
|
|
|
- }
|
|
|
- }
|
|
|
- */
|
|
|
}
|
|
|
|
|
|
void updateResolution(const Resolution& _resolution)
|
|
|
@@ -1117,17 +1098,16 @@ namespace bgfx { namespace mtl
|
|
|
: 1
|
|
|
;
|
|
|
|
|
|
- //TODO: there should be a way to specify if backbuffer needs stencil/depth.
|
|
|
const uint32_t maskFlags = ~(0
|
|
|
- | BGFX_RESET_HMD_RECENTER
|
|
|
- | BGFX_RESET_MAXANISOTROPY
|
|
|
- | BGFX_RESET_DEPTH_CLAMP
|
|
|
- | BGFX_RESET_SUSPEND
|
|
|
- );
|
|
|
+ | BGFX_RESET_HMD_RECENTER
|
|
|
+ | BGFX_RESET_MAXANISOTROPY
|
|
|
+ | BGFX_RESET_DEPTH_CLAMP
|
|
|
+ | BGFX_RESET_SUSPEND
|
|
|
+ );
|
|
|
|
|
|
- if (m_resolution.m_width != _resolution.m_width
|
|
|
- || m_resolution.m_height != _resolution.m_height
|
|
|
- || (m_resolution.m_flags&maskFlags) != (_resolution.m_flags&maskFlags) )
|
|
|
+ if (m_resolution.m_width != _resolution.m_width
|
|
|
+ || m_resolution.m_height != _resolution.m_height
|
|
|
+ || (m_resolution.m_flags&maskFlags) != (_resolution.m_flags&maskFlags) )
|
|
|
{
|
|
|
int sampleCount = s_msaa[(_resolution.m_flags&BGFX_RESET_MSAA_MASK)>>BGFX_RESET_MSAA_SHIFT];
|
|
|
|
|
|
@@ -1135,9 +1115,9 @@ namespace bgfx { namespace mtl
|
|
|
|
|
|
m_metalLayer.drawableSize = CGSizeMake(_resolution.m_width, _resolution.m_height);
|
|
|
m_metalLayer.pixelFormat = (m_resolution.m_flags & BGFX_RESET_SRGB_BACKBUFFER)
|
|
|
- ? MTLPixelFormatBGRA8Unorm_sRGB
|
|
|
- : MTLPixelFormatBGRA8Unorm
|
|
|
- ;
|
|
|
+ ? MTLPixelFormatBGRA8Unorm_sRGB
|
|
|
+ : MTLPixelFormatBGRA8Unorm
|
|
|
+ ;
|
|
|
|
|
|
m_resolution = _resolution;
|
|
|
m_resolution.m_flags &= ~BGFX_RESET_INTERNAL_FORCE;
|
|
|
@@ -1190,10 +1170,10 @@ namespace bgfx { namespace mtl
|
|
|
bx::HashMurmur2A murmur;
|
|
|
murmur.begin();
|
|
|
murmur.add(1);
|
|
|
- murmur.add((uint32_t)m_metalLayer.pixelFormat);
|
|
|
- murmur.add((uint32_t)m_backBufferDepth.pixelFormat());
|
|
|
- murmur.add((uint32_t)m_backBufferStencil.pixelFormat());
|
|
|
- murmur.add((uint32_t)sampleCount);
|
|
|
+ murmur.add( (uint32_t)m_metalLayer.pixelFormat);
|
|
|
+ murmur.add( (uint32_t)m_backBufferDepth.pixelFormat() );
|
|
|
+ murmur.add( (uint32_t)m_backBufferStencil.pixelFormat() );
|
|
|
+ murmur.add( (uint32_t)sampleCount);
|
|
|
m_backBufferPixelFormatHash = murmur.end();
|
|
|
|
|
|
for (uint32_t ii = 0; ii < BX_COUNTOF(m_frameBuffers); ++ii)
|
|
|
@@ -1249,7 +1229,6 @@ namespace bgfx { namespace mtl
|
|
|
|
|
|
MTLRegion region = { { 0, 0, 0 }, { m_resolution.m_width, m_resolution.m_height, 1 } };
|
|
|
|
|
|
- //TODO: enable screenshot target when capturing
|
|
|
m_screenshotTarget.getBytes(m_capture, 4*m_resolution.m_width, 0, region, 0, 0);
|
|
|
|
|
|
m_commandBuffer = m_cmd.alloc();
|
|
|
@@ -1456,7 +1435,7 @@ namespace bgfx { namespace mtl
|
|
|
}
|
|
|
|
|
|
ProgramMtl& program = m_program[_clearQuad.m_program[numMrt-1].idx];
|
|
|
- m_renderCommandEncoder.setRenderPipelineState(program.getRenderPipelineState(state, 0, fbh, _clearQuad.m_vb->decl, 0));
|
|
|
+ m_renderCommandEncoder.setRenderPipelineState(program.getRenderPipelineState(state, 0, fbh, _clearQuad.m_vb->decl, 0) );
|
|
|
|
|
|
uint32_t fragmentUniformBufferSize = program.m_fshConstantBufferSize;
|
|
|
|
|
|
@@ -1476,9 +1455,10 @@ namespace bgfx { namespace mtl
|
|
|
bx::memCopy(mrtClear[ii], _palette[index], 16);
|
|
|
}
|
|
|
|
|
|
- bx::memCopy((uint8_t*)m_uniformBuffer.contents() + m_uniformBufferFragmentOffset,
|
|
|
- mrtClear,
|
|
|
- bx::uint32_min(fragmentUniformBufferSize, sizeof(mrtClear)));
|
|
|
+ bx::memCopy( (uint8_t*)m_uniformBuffer.contents() + m_uniformBufferFragmentOffset
|
|
|
+ , mrtClear
|
|
|
+ , bx::uint32_min(fragmentUniformBufferSize, sizeof(mrtClear) )
|
|
|
+ );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -1490,9 +1470,10 @@ namespace bgfx { namespace mtl
|
|
|
_clear.m_index[3]*1.0f/255.0f,
|
|
|
};
|
|
|
|
|
|
- bx::memCopy((uint8_t*)m_uniformBuffer.contents() + m_uniformBufferFragmentOffset,
|
|
|
- rgba,
|
|
|
- bx::uint32_min(fragmentUniformBufferSize, sizeof(rgba)));
|
|
|
+ bx::memCopy( (uint8_t*)m_uniformBuffer.contents() + m_uniformBufferFragmentOffset
|
|
|
+ , rgba
|
|
|
+ , bx::uint32_min(fragmentUniformBufferSize, sizeof(rgba) )
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
m_uniformBufferFragmentOffset += fragmentUniformBufferSize;
|
|
|
@@ -1826,7 +1807,7 @@ namespace bgfx { namespace mtl
|
|
|
RendererContextI* rendererCreate()
|
|
|
{
|
|
|
s_renderMtl = BX_NEW(g_allocator, RendererContextMtl);
|
|
|
- if (!s_renderMtl->init())
|
|
|
+ if (!s_renderMtl->init() )
|
|
|
{
|
|
|
BX_DELETE(g_allocator, s_renderMtl);
|
|
|
s_renderMtl = NULL;
|
|
|
@@ -1933,11 +1914,11 @@ namespace bgfx { namespace mtl
|
|
|
bx::memSet(m_attributes, 0xff, sizeof(m_attributes) );
|
|
|
uint32_t used = 0;
|
|
|
uint32_t instUsed = 0;
|
|
|
- if (NULL != _vsh->m_function.m_obj )
|
|
|
+ if (NULL != _vsh->m_function.m_obj)
|
|
|
{
|
|
|
for (MTLVertexAttribute* attrib in _vsh->m_function.m_obj.vertexAttributes)
|
|
|
{
|
|
|
- if (attrib.active )
|
|
|
+ if (attrib.active)
|
|
|
{
|
|
|
const char* name = utf8String(attrib.name);
|
|
|
uint32_t loc = (uint32_t)attrib.attributeIndex;
|
|
|
@@ -1945,7 +1926,7 @@ namespace bgfx { namespace mtl
|
|
|
|
|
|
for (uint8_t ii = 0; ii < Attrib::Count; ++ii)
|
|
|
{
|
|
|
- if (0 == bx::strCmp(s_attribName[ii],name))
|
|
|
+ if (0 == bx::strCmp(s_attribName[ii],name) )
|
|
|
{
|
|
|
m_attributes[ii] = loc;
|
|
|
m_used[used++] = ii;
|
|
|
@@ -1955,7 +1936,7 @@ namespace bgfx { namespace mtl
|
|
|
|
|
|
for (uint32_t ii = 0; ii < BX_COUNTOF(s_instanceDataName); ++ii)
|
|
|
{
|
|
|
- if (0 == bx::strCmp(s_instanceDataName[ii],name))
|
|
|
+ if (0 == bx::strCmp(s_instanceDataName[ii],name) )
|
|
|
{
|
|
|
m_instanceData[instUsed++] = loc;
|
|
|
}
|
|
|
@@ -2079,7 +2060,7 @@ namespace bgfx { namespace mtl
|
|
|
pd.colorAttachments[ii].pixelFormat = texture.m_ptr.m_obj.pixelFormat;
|
|
|
}
|
|
|
|
|
|
- if (isValid(frameBuffer.m_depthHandle))
|
|
|
+ if (isValid(frameBuffer.m_depthHandle) )
|
|
|
{
|
|
|
const TextureMtl& texture = s_renderMtl->m_textures[frameBuffer.m_depthHandle.idx];
|
|
|
pd.depthAttachmentPixelFormat = texture.m_ptr.m_obj.pixelFormat;
|
|
|
@@ -2229,7 +2210,7 @@ namespace bgfx { namespace mtl
|
|
|
UniformBuffer*& constantBuffer = (shaderType == 0 ? m_vshConstantBuffer : m_fshConstantBuffer);
|
|
|
uint8_t fragmentBit = (1 == shaderType ? BGFX_UNIFORM_FRAGMENTBIT : 0);
|
|
|
|
|
|
- for (MTLArgument* arg in (shaderType == 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)
|
|
|
@@ -2298,8 +2279,8 @@ namespace bgfx { namespace mtl
|
|
|
}
|
|
|
|
|
|
UniformType::Enum type = convertMtlType(dataType);
|
|
|
- constantBuffer->writeUniformHandle((UniformType::Enum)(type|fragmentBit), uint32_t(uniform.offset), info->m_handle, uint16_t(num) );
|
|
|
- BX_TRACE("store %s %d offset:%d", name, info->m_handle, uint32_t(uniform.offset));
|
|
|
+ constantBuffer->writeUniformHandle( (UniformType::Enum)(type|fragmentBit), uint32_t(uniform.offset), info->m_handle, uint16_t(num) );
|
|
|
+ BX_TRACE("store %s %d offset:%d", name, info->m_handle, uint32_t(uniform.offset) );
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -2366,8 +2347,8 @@ namespace bgfx { namespace mtl
|
|
|
{
|
|
|
BX_UNUSED(_discard);
|
|
|
|
|
|
- //TODO: cannot call this more than once per frame
|
|
|
- if ( m_dynamic && _discard )
|
|
|
+ if (m_dynamic
|
|
|
+ && _discard)
|
|
|
{
|
|
|
m_bufferIndex = (m_bufferIndex + 1) % MTL_MAX_FRAMES_IN_FLIGHT;
|
|
|
bx::memCopy( (uint8_t*)getBuffer().contents() + _offset, _data, _size);
|
|
|
@@ -2643,7 +2624,7 @@ namespace bgfx { namespace mtl
|
|
|
const uint32_t bpp = bimg::getBitsPerPixel(bimg::TextureFormat::Enum(m_textureFormat) );
|
|
|
const uint32_t rectpitch = _rect.m_width*bpp/8;
|
|
|
const uint32_t srcpitch = UINT16_MAX == _pitch ? rectpitch : _pitch;
|
|
|
- const uint32_t slice = ((m_type == Texture3D) ? 0 : _side + _z * (m_type == TextureCube ? 6 : 1));
|
|
|
+ const uint32_t slice = ( (m_type == Texture3D) ? 0 : _side + _z * (m_type == TextureCube ? 6 : 1) );
|
|
|
const uint16_t z = (m_type == Texture3D) ? _z : 0 ;
|
|
|
|
|
|
const bool convert = m_textureFormat != m_requestedFormat;
|
|
|
@@ -2771,18 +2752,18 @@ namespace bgfx { namespace mtl
|
|
|
for (uint32_t ii = 0; ii < m_num; ++ii)
|
|
|
{
|
|
|
const TextureMtl& texture = s_renderMtl->m_textures[m_colorHandle[ii].idx];
|
|
|
- murmur.add((uint32_t)texture.m_ptr.pixelFormat());
|
|
|
+ murmur.add( (uint32_t)texture.m_ptr.pixelFormat() );
|
|
|
}
|
|
|
- if (!isValid(m_depthHandle))
|
|
|
+ if (!isValid(m_depthHandle) )
|
|
|
{
|
|
|
- murmur.add((uint32_t)MTLPixelFormatInvalid);
|
|
|
- murmur.add((uint32_t)MTLPixelFormatInvalid);
|
|
|
+ murmur.add( (uint32_t)MTLPixelFormatInvalid);
|
|
|
+ murmur.add( (uint32_t)MTLPixelFormatInvalid);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
const TextureMtl& depthTexture = s_renderMtl->m_textures[m_depthHandle.idx];
|
|
|
- murmur.add((uint32_t)depthTexture.m_ptr.pixelFormat());
|
|
|
- murmur.add((uint32_t)(NULL != depthTexture.m_ptrStencil ? depthTexture.m_ptrStencil.pixelFormat() : MTLPixelFormatInvalid));
|
|
|
+ murmur.add( (uint32_t)depthTexture.m_ptr.pixelFormat() );
|
|
|
+ murmur.add( (uint32_t)(NULL != depthTexture.m_ptrStencil ? depthTexture.m_ptrStencil.pixelFormat() : MTLPixelFormatInvalid) );
|
|
|
}
|
|
|
murmur.add(1); //SampleCount
|
|
|
|
|
|
@@ -2799,7 +2780,6 @@ namespace bgfx { namespace mtl
|
|
|
void FrameBufferMtl::postReset()
|
|
|
{
|
|
|
BX_WARN(false, "FrameBufferMtl::postReset not yet implemented");
|
|
|
- //TODO: what should we do here?
|
|
|
}
|
|
|
|
|
|
uint16_t FrameBufferMtl::destroy()
|
|
|
@@ -2903,7 +2883,7 @@ namespace bgfx { namespace mtl
|
|
|
|
|
|
static void setTimestamp(void* _data)
|
|
|
{
|
|
|
- *((int64_t*)_data) = bx::getHPCounter();
|
|
|
+ *( (int64_t*)_data) = bx::getHPCounter();
|
|
|
}
|
|
|
|
|
|
void TimerQueryMtl::addHandlers(CommandBuffer& _commandBuffer)
|
|
|
@@ -3029,14 +3009,14 @@ namespace bgfx { namespace mtl
|
|
|
bool readBack = !!(dst.m_flags & BGFX_TEXTURE_READ_BACK);
|
|
|
#endif // BX_PLATFORM_OSX
|
|
|
|
|
|
- if ( MTLTextureType3D == src.m_ptr.textureType())
|
|
|
+ if ( MTLTextureType3D == src.m_ptr.textureType() )
|
|
|
{
|
|
|
m_blitCommandEncoder.copyFromTexture(
|
|
|
src.m_ptr
|
|
|
, 0
|
|
|
, 0
|
|
|
, MTLOriginMake(blit.m_srcX, blit.m_srcY, blit.m_srcZ)
|
|
|
- , MTLSizeMake(width, height, bx::uint32_imax(depth, 1))
|
|
|
+ , MTLSizeMake(width, height, bx::uint32_imax(depth, 1) )
|
|
|
, dst.m_ptr
|
|
|
, 0
|
|
|
, 0
|
|
|
@@ -3246,7 +3226,7 @@ namespace bgfx { namespace mtl
|
|
|
view = key.m_view;
|
|
|
programIdx = invalidHandle;
|
|
|
|
|
|
- viewRestart = ( (BGFX_VIEW_STEREO == (_render->m_viewFlags[view] & BGFX_VIEW_STEREO) ) );
|
|
|
+ viewRestart = BGFX_VIEW_STEREO == (_render->m_viewFlags[view] & BGFX_VIEW_STEREO);
|
|
|
viewRestart &= hmdEnabled;
|
|
|
|
|
|
if (viewRestart)
|
|
|
@@ -3475,7 +3455,7 @@ namespace bgfx { namespace mtl
|
|
|
currentBind.clear();
|
|
|
|
|
|
programIdx = invalidHandle;
|
|
|
- setDepthStencilState(newFlags, packStencil(BGFX_STENCIL_DEFAULT, BGFX_STENCIL_DEFAULT));
|
|
|
+ setDepthStencilState(newFlags, packStencil(BGFX_STENCIL_DEFAULT, BGFX_STENCIL_DEFAULT) );
|
|
|
|
|
|
const uint64_t pt = newFlags&BGFX_STATE_PT_MASK;
|
|
|
primIndex = uint8_t(pt>>BGFX_STATE_PT_SHIFT);
|
|
|
@@ -3955,7 +3935,7 @@ namespace bgfx { namespace mtl
|
|
|
}
|
|
|
|
|
|
blit(this, _textVideoMemBlitter, tvm);
|
|
|
- rce = m_renderCommandEncoder; //TODO: ugly, blit can create encoder
|
|
|
+ rce = m_renderCommandEncoder;
|
|
|
|
|
|
rce.popDebugGroup();
|
|
|
}
|
|
|
@@ -3964,7 +3944,7 @@ namespace bgfx { namespace mtl
|
|
|
rce.pushDebugGroup("debugtext");
|
|
|
|
|
|
blit(this, _textVideoMemBlitter, _render->m_textVideoMem);
|
|
|
- rce = m_renderCommandEncoder; //TODO: ugly, blit can create encoder
|
|
|
+ rce = m_renderCommandEncoder;
|
|
|
|
|
|
rce.popDebugGroup();
|
|
|
}
|