mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-17 20:52:36 +01:00
Metal: Improve release macros to keep track of refcount.
This commit is contained in:
@@ -4594,7 +4594,7 @@ namespace bgfx
|
||||
++depth;
|
||||
|
||||
BGFX_ERROR_CHECK(
|
||||
// if BGFX_TEXTURE_RT_MSAA_X2 or greater than either BGFX_TEXTURE_RT_WRITE_ONLY or BGFX_TEXTURE_MSAA_SAMPLE is required
|
||||
// if BGFX_TEXTURE_RT_MSAA_X2 or greater than either BGFX_TEXTURE_RT_WRITE_ONLY or BGFX_TEXTURE_MSAA_SAMPLE is required
|
||||
// if BGFX_TEXTURE_RT with no MSSA then this is not required.
|
||||
(1 == ((tr.m_flags & BGFX_TEXTURE_RT_MSAA_MASK) >> BGFX_TEXTURE_RT_MSAA_SHIFT))
|
||||
|| (0 != (tr.m_flags & (BGFX_TEXTURE_RT_WRITE_ONLY | BGFX_TEXTURE_MSAA_SAMPLE)))
|
||||
|
||||
@@ -37,6 +37,52 @@
|
||||
BGFX_PROFILER_END(); \
|
||||
BX_MACRO_BLOCK_END
|
||||
|
||||
#define _MTL_RELEASE(_obj, _expected, _check) \
|
||||
BX_MACRO_BLOCK_BEGIN \
|
||||
if (NULL != _obj) \
|
||||
{ \
|
||||
const NSUInteger count = [_obj retainCount] - 1; \
|
||||
_check(isGraphicsDebuggerPresent() \
|
||||
|| _expected == count \
|
||||
, "%p RefCount is %d (expected %d). Label: \"%s\"." \
|
||||
, _obj \
|
||||
, count \
|
||||
, _expected \
|
||||
, [_obj respondsToSelector:@selector(label)] \
|
||||
? [[_obj performSelector:@selector(label)] UTF8String] \
|
||||
: "?!" \
|
||||
); \
|
||||
BX_UNUSED(count); \
|
||||
[_obj release]; \
|
||||
_obj = NULL; \
|
||||
} \
|
||||
BX_MACRO_BLOCK_END
|
||||
|
||||
#define _MTL_CHECK_REFCOUNT(_obj, _expected) \
|
||||
BX_MACRO_BLOCK_BEGIN \
|
||||
const NSUInteger count = [_obj retainCount]; \
|
||||
BX_ASSERT(isGraphicsDebuggerPresent() \
|
||||
|| _expected == count \
|
||||
, "%p RefCount is %d (expected %d). Label: \"%s\"." \
|
||||
, _obj \
|
||||
, count \
|
||||
, _expected \
|
||||
, [_obj respondsToSelector:@selector(label)] \
|
||||
? [[_obj performSelector:@selector(label)] UTF8String] \
|
||||
: "?!" \
|
||||
); \
|
||||
BX_MACRO_BLOCK_END
|
||||
|
||||
#if BGFX_CONFIG_DEBUG
|
||||
# define MTL_CHECK_REFCOUNT(_ptr, _expected) _MTL_CHECK_REFCOUNT(_ptr, _expected)
|
||||
#else
|
||||
# define MTL_CHECK_REFCOUNT(_ptr, _expected)
|
||||
#endif // BGFX_CONFIG_DEBUG
|
||||
|
||||
#define MTL_RELEASE(_obj, _expected) _MTL_RELEASE(_obj, _expected, BX_ASSERT)
|
||||
#define MTL_RELEASE_W(_obj, _expected) _MTL_RELEASE(_obj, _expected, BX_WARN)
|
||||
#define MTL_RELEASE_I(_obj) _MTL_RELEASE(_obj, 0, BX_NOOP)
|
||||
|
||||
namespace bgfx { namespace mtl
|
||||
{
|
||||
//runtime os check
|
||||
@@ -75,9 +121,9 @@ namespace bgfx { namespace mtl
|
||||
class name \
|
||||
{ \
|
||||
public: \
|
||||
name(id <MTL##name> _obj = nil) : m_obj(_obj) {} \
|
||||
operator id <MTL##name>() const { return m_obj; } \
|
||||
id <MTL##name> m_obj;
|
||||
name(id<MTL##name> _obj = NULL) : m_obj(_obj) {} \
|
||||
operator id<MTL##name>() const { return m_obj; } \
|
||||
id<MTL##name> m_obj;
|
||||
|
||||
#define MTL_CLASS_END };
|
||||
|
||||
@@ -165,7 +211,10 @@ namespace bgfx { namespace mtl
|
||||
|
||||
void setLabel(const char* _label)
|
||||
{
|
||||
[m_obj setLabel:@(_label)];
|
||||
if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION) )
|
||||
{
|
||||
[m_obj setLabel:@(_label)];
|
||||
}
|
||||
}
|
||||
MTL_CLASS_END
|
||||
|
||||
@@ -198,12 +247,12 @@ namespace bgfx { namespace mtl
|
||||
|
||||
void addScheduledHandler(mtlCallback _cb, void* _data)
|
||||
{
|
||||
[m_obj addScheduledHandler:^(id <MTLCommandBuffer>){ _cb(_data); }];
|
||||
[m_obj addScheduledHandler:^(id<MTLCommandBuffer>){ _cb(_data); }];
|
||||
}
|
||||
|
||||
void addCompletedHandler(mtlCallback _cb, void* _data)
|
||||
{
|
||||
[m_obj addCompletedHandler:^(id <MTLCommandBuffer>){ _cb(_data); }];
|
||||
[m_obj addCompletedHandler:^(id<MTLCommandBuffer>){ _cb(_data); }];
|
||||
}
|
||||
|
||||
void presentDrawable(id<MTLDrawable> _drawable)
|
||||
@@ -256,7 +305,7 @@ namespace bgfx { namespace mtl
|
||||
}
|
||||
|
||||
void dispatchThreadgroupsWithIndirectBuffer(
|
||||
id <MTLBuffer> _indirectBuffer
|
||||
id<MTLBuffer> _indirectBuffer
|
||||
, NSUInteger _indirectBufferOffset
|
||||
, MTLSize _threadsPerThreadgroup
|
||||
)
|
||||
@@ -300,7 +349,7 @@ namespace bgfx { namespace mtl
|
||||
id<MTLLibrary> newLibraryWithSource(const char* _source)
|
||||
{
|
||||
NSError* error;
|
||||
id<MTLLibrary> lib = [m_obj newLibraryWithSource:@(_source) options:nil error:&error];
|
||||
id<MTLLibrary> lib = [m_obj newLibraryWithSource:@(_source) options:NULL error:&error];
|
||||
BX_WARN(NULL == error
|
||||
, "Shader compilation failed: %s"
|
||||
, [error.localizedDescription cStringUsingEncoding:NSASCIIStringEncoding]
|
||||
@@ -345,10 +394,10 @@ namespace bgfx { namespace mtl
|
||||
return [m_obj newDepthStencilStateWithDescriptor:_descriptor];
|
||||
}
|
||||
|
||||
id <MTLRenderPipelineState> newRenderPipelineStateWithDescriptor(MTLRenderPipelineDescriptor* _descriptor)
|
||||
id<MTLRenderPipelineState> newRenderPipelineStateWithDescriptor(MTLRenderPipelineDescriptor* _descriptor)
|
||||
{
|
||||
NSError* error;
|
||||
id <MTLRenderPipelineState> state = [m_obj newRenderPipelineStateWithDescriptor:_descriptor error:&error];
|
||||
id<MTLRenderPipelineState> state = [m_obj newRenderPipelineStateWithDescriptor:_descriptor error:&error];
|
||||
BX_WARN(NULL == error
|
||||
, "newRenderPipelineStateWithDescriptor failed: %s"
|
||||
, [error.localizedDescription cStringUsingEncoding:NSASCIIStringEncoding]
|
||||
@@ -356,14 +405,14 @@ namespace bgfx { namespace mtl
|
||||
return state;
|
||||
}
|
||||
|
||||
id <MTLRenderPipelineState> newRenderPipelineStateWithDescriptor(
|
||||
id<MTLRenderPipelineState> newRenderPipelineStateWithDescriptor(
|
||||
MTLRenderPipelineDescriptor* _descriptor
|
||||
, MTLPipelineOption _options
|
||||
, MTLRenderPipelineReflection** _reflection
|
||||
)
|
||||
{
|
||||
NSError* error;
|
||||
id <MTLRenderPipelineState> state = [m_obj newRenderPipelineStateWithDescriptor:_descriptor options:_options reflection:_reflection error:&error];
|
||||
id<MTLRenderPipelineState> state = [m_obj newRenderPipelineStateWithDescriptor:_descriptor options:_options reflection:_reflection error:&error];
|
||||
|
||||
BX_WARN(NULL == error
|
||||
, "newRenderPipelineStateWithDescriptor failed: %s"
|
||||
@@ -373,14 +422,14 @@ namespace bgfx { namespace mtl
|
||||
}
|
||||
|
||||
// Creating Command Objects Needed to Perform Computational Tasks
|
||||
id <MTLComputePipelineState> newComputePipelineStateWithFunction(
|
||||
id <MTLFunction> _computeFunction
|
||||
id<MTLComputePipelineState> newComputePipelineStateWithFunction(
|
||||
id<MTLFunction> _computeFunction
|
||||
, MTLPipelineOption _options
|
||||
, MTLComputePipelineReflection** _reflection
|
||||
)
|
||||
{
|
||||
NSError* error;
|
||||
id <MTLComputePipelineState> state = [m_obj newComputePipelineStateWithFunction:_computeFunction options:_options reflection:_reflection error:&error];
|
||||
id<MTLComputePipelineState> state = [m_obj newComputePipelineStateWithFunction:_computeFunction options:_options reflection:_reflection error:&error];
|
||||
|
||||
BX_WARN(NULL == error
|
||||
, "newComputePipelineStateWithFunction failed: %s"
|
||||
@@ -391,7 +440,7 @@ namespace bgfx { namespace mtl
|
||||
|
||||
bool supportsTextureSampleCount(int sampleCount)
|
||||
{
|
||||
if (BX_ENABLED(BX_PLATFORM_IOS) && !iOSVersionEqualOrGreater("9.0.0"))
|
||||
if (BX_ENABLED(BX_PLATFORM_IOS) && !iOSVersionEqualOrGreater("9.0.0") )
|
||||
{
|
||||
return sampleCount == 1 || sampleCount == 2 || sampleCount == 4;
|
||||
}
|
||||
@@ -427,7 +476,7 @@ namespace bgfx { namespace mtl
|
||||
MTL_CLASS_END
|
||||
|
||||
MTL_CLASS(Library)
|
||||
id <MTLFunction> newFunctionWithName(const char* _functionName)
|
||||
id<MTLFunction> newFunctionWithName(const char* _functionName)
|
||||
{
|
||||
return [m_obj newFunctionWithName:@(_functionName)];
|
||||
}
|
||||
@@ -558,7 +607,7 @@ namespace bgfx { namespace mtl
|
||||
|
||||
void drawPrimitives(
|
||||
MTLPrimitiveType _primitiveType
|
||||
, id <MTLBuffer> _indirectBuffer
|
||||
, id<MTLBuffer> _indirectBuffer
|
||||
, NSUInteger _indirectBufferOffset)
|
||||
{
|
||||
[m_obj drawPrimitives:_primitiveType indirectBuffer:_indirectBuffer indirectBufferOffset:_indirectBufferOffset];
|
||||
@@ -567,9 +616,9 @@ namespace bgfx { namespace mtl
|
||||
void drawIndexedPrimitives(
|
||||
MTLPrimitiveType _primitiveType
|
||||
, MTLIndexType _indexType
|
||||
, id <MTLBuffer> _indexBuffer
|
||||
, id<MTLBuffer> _indexBuffer
|
||||
, NSUInteger _indexBufferOffset
|
||||
, id <MTLBuffer> _indirectBuffer
|
||||
, id<MTLBuffer> _indirectBuffer
|
||||
, NSUInteger _indirectBufferOffset)
|
||||
{
|
||||
[m_obj drawIndexedPrimitives:_primitiveType indexType:_indexType indexBuffer:_indexBuffer indexBufferOffset:_indexBufferOffset indirectBuffer:_indirectBuffer indirectBufferOffset:_indirectBufferOffset];
|
||||
@@ -653,7 +702,10 @@ namespace bgfx { namespace mtl
|
||||
|
||||
void setLabel(const char* _label)
|
||||
{
|
||||
[m_obj setLabel:@(_label)];
|
||||
if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION) )
|
||||
{
|
||||
[m_obj setLabel:@(_label)];
|
||||
}
|
||||
}
|
||||
MTL_CLASS_END
|
||||
|
||||
@@ -748,15 +800,6 @@ namespace bgfx { namespace mtl
|
||||
return [_str UTF8String];
|
||||
}
|
||||
|
||||
#define MTL_RELEASE(_obj) \
|
||||
BX_MACRO_BLOCK_BEGIN \
|
||||
if (NULL != _obj) \
|
||||
{ \
|
||||
[_obj release]; \
|
||||
_obj = NULL; \
|
||||
} \
|
||||
BX_MACRO_BLOCK_END
|
||||
|
||||
// end of c++ wrapper
|
||||
|
||||
template <typename Ty>
|
||||
@@ -823,7 +866,7 @@ namespace bgfx { namespace mtl
|
||||
|
||||
void destroy()
|
||||
{
|
||||
MTL_RELEASE(m_ptr);
|
||||
MTL_RELEASE_W(m_ptr, 0);
|
||||
|
||||
if (NULL != m_dynamic)
|
||||
{
|
||||
@@ -854,7 +897,6 @@ namespace bgfx { namespace mtl
|
||||
VertexLayoutHandle m_layoutHandle;
|
||||
};
|
||||
|
||||
|
||||
struct ShaderMtl
|
||||
{
|
||||
ShaderMtl()
|
||||
@@ -863,10 +905,10 @@ namespace bgfx { namespace mtl
|
||||
}
|
||||
|
||||
void create(const Memory* _mem);
|
||||
|
||||
void destroy()
|
||||
{
|
||||
MTL_RELEASE(m_function);
|
||||
|
||||
MTL_RELEASE_W(m_function, 0);
|
||||
}
|
||||
|
||||
Function m_function;
|
||||
@@ -995,17 +1037,17 @@ namespace bgfx { namespace mtl
|
||||
|
||||
void destroy()
|
||||
{
|
||||
if (0 == (m_flags & BGFX_SAMPLER_INTERNAL_SHARED))
|
||||
if (0 == (m_flags & BGFX_SAMPLER_INTERNAL_SHARED) )
|
||||
{
|
||||
MTL_RELEASE(m_ptr);
|
||||
MTL_RELEASE(m_ptrMsaa);
|
||||
MTL_RELEASE_W(m_ptr, 0);
|
||||
MTL_RELEASE_W(m_ptrMsaa, 0);
|
||||
}
|
||||
|
||||
MTL_RELEASE(m_ptrStencil);
|
||||
MTL_RELEASE_W(m_ptrStencil, 0);
|
||||
|
||||
for (uint32_t ii = 0; ii < m_numMips; ++ii)
|
||||
{
|
||||
MTL_RELEASE(m_ptrMips[ii]);
|
||||
MTL_RELEASE_W(m_ptrMips[ii], 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1056,15 +1098,15 @@ namespace bgfx { namespace mtl
|
||||
struct SwapChainMtl
|
||||
{
|
||||
SwapChainMtl()
|
||||
: m_metalLayer(nil)
|
||||
: m_metalLayer(NULL)
|
||||
#if BX_PLATFORM_VISIONOS
|
||||
, m_layerRenderer(NULL)
|
||||
, m_layerRendererDrawable(NULL)
|
||||
, m_frame(NULL)
|
||||
, m_useLayerRenderer(true)
|
||||
#endif // BX_PLATFORM_VISIONOS
|
||||
, m_drawable(nil)
|
||||
, m_drawableTexture(nil)
|
||||
, m_drawable(NULL)
|
||||
, m_drawableTexture(NULL)
|
||||
, m_backBufferColorMsaa()
|
||||
, m_backBufferDepth()
|
||||
, m_backBufferStencil()
|
||||
@@ -1075,12 +1117,10 @@ namespace bgfx { namespace mtl
|
||||
~SwapChainMtl();
|
||||
|
||||
void init(void* _nwh);
|
||||
uint32_t resize(
|
||||
uint32_t _width
|
||||
, uint32_t _height
|
||||
, TextureFormat::Enum _format
|
||||
, TextureFormat::Enum _depthFormat
|
||||
);
|
||||
|
||||
void releaseBackBuffer();
|
||||
|
||||
uint32_t resize(uint32_t _width, uint32_t _height, TextureFormat::Enum _format, TextureFormat::Enum _depthFormat);
|
||||
|
||||
id<MTLTexture> currentDrawableTexture();
|
||||
|
||||
@@ -1092,12 +1132,14 @@ namespace bgfx { namespace mtl
|
||||
cp_frame_t m_frame;
|
||||
bool m_useLayerRenderer;
|
||||
#endif // BX_PLATFORM_VISIONOS
|
||||
id <CAMetalDrawable> m_drawable;
|
||||
id<CAMetalDrawable> m_drawable;
|
||||
|
||||
id<MTLTexture> m_drawableTexture;
|
||||
|
||||
id <MTLTexture> m_drawableTexture;
|
||||
Texture m_backBufferColorMsaa;
|
||||
Texture m_backBufferDepth;
|
||||
Texture m_backBufferStencil;
|
||||
|
||||
uint32_t m_maxAnisotropy;
|
||||
void* m_nwh;
|
||||
};
|
||||
@@ -1159,8 +1201,8 @@ namespace bgfx { namespace mtl
|
||||
void init(Device _device);
|
||||
void shutdown();
|
||||
CommandBuffer alloc();
|
||||
void kick(bool _endFrame, bool _waitForFinish = false);
|
||||
void finish(bool _finishAll = false);
|
||||
void kick(bool _endFrame, bool _waitForFinish);
|
||||
void finish(bool _finishAll);
|
||||
void release(NSObject* _ptr);
|
||||
void consume();
|
||||
|
||||
|
||||
@@ -217,8 +217,9 @@ namespace bgfx { namespace mtl
|
||||
bool m_autoGetMipmap;
|
||||
};
|
||||
|
||||
BX_PRAGMA_DIAGNOSTIC_PUSH();
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wunguarded-availability-new");
|
||||
BX_PRAGMA_DIAGNOSTIC_PUSH();
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wunguarded-availability-new");
|
||||
|
||||
static TextureFormatInfo s_textureFormat[] =
|
||||
{
|
||||
#define $0 MTLTextureSwizzleZero
|
||||
@@ -330,9 +331,10 @@ namespace bgfx { namespace mtl
|
||||
#undef $B
|
||||
#undef $A
|
||||
};
|
||||
BX_PRAGMA_DIAGNOSTIC_POP();
|
||||
static_assert(TextureFormat::Count == BX_COUNTOF(s_textureFormat) );
|
||||
|
||||
BX_PRAGMA_DIAGNOSTIC_POP();
|
||||
|
||||
int32_t s_msaa[] =
|
||||
{
|
||||
1,
|
||||
@@ -607,12 +609,14 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
|
||||
reset(m_renderPipelineDescriptor);
|
||||
m_renderPipelineDescriptor.colorAttachments[0].pixelFormat = getSwapChainPixelFormat(m_mainFrameBuffer.m_swapChain);
|
||||
|
||||
#if BX_PLATFORM_VISIONOS
|
||||
if (m_mainFrameBuffer.m_swapChain->m_useLayerRenderer)
|
||||
{
|
||||
m_renderPipelineDescriptor.depthAttachmentPixelFormat = cp_layer_renderer_configuration_get_depth_format(m_mainFrameBuffer.m_swapChain->m_layerRendererConfiguration);
|
||||
}
|
||||
#endif // BX_PLATFORM_VISIONOS
|
||||
|
||||
m_renderPipelineDescriptor.vertexFunction = m_screenshotBlitProgram.m_vsh->m_function;
|
||||
m_renderPipelineDescriptor.fragmentFunction = m_screenshotBlitProgram.m_fsh->m_function;
|
||||
m_screenshotBlitRenderPipelineState = m_device.newRenderPipelineStateWithDescriptor(m_renderPipelineDescriptor);
|
||||
@@ -921,6 +925,8 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
m_depthStencilStateCache.invalidate();
|
||||
m_samplerStateCache.invalidate();
|
||||
|
||||
m_cmd.kick(false, true);
|
||||
|
||||
for (uint32_t ii = 0; ii < BX_COUNTOF(m_shaders); ++ii)
|
||||
{
|
||||
m_shaders[ii].destroy();
|
||||
@@ -934,38 +940,38 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
m_screenshotBlitProgramVsh.destroy();
|
||||
m_screenshotBlitProgramFsh.destroy();
|
||||
m_screenshotBlitProgram.destroy();
|
||||
MTL_RELEASE(m_screenshotBlitRenderPipelineState);
|
||||
MTL_RELEASE(m_screenshotBlitRenderPipelineState, 0);
|
||||
|
||||
captureFinish();
|
||||
|
||||
MTL_RELEASE(m_depthStencilDescriptor);
|
||||
MTL_RELEASE(m_frontFaceStencilDescriptor);
|
||||
MTL_RELEASE(m_backFaceStencilDescriptor);
|
||||
MTL_RELEASE(m_renderPipelineDescriptor);
|
||||
MTL_RELEASE(m_vertexDescriptor);
|
||||
MTL_RELEASE(m_textureDescriptor);
|
||||
MTL_RELEASE(m_samplerDescriptor);
|
||||
MTL_RELEASE(m_depthStencilDescriptor, 0);
|
||||
MTL_RELEASE(m_frontFaceStencilDescriptor, 0);
|
||||
MTL_RELEASE(m_backFaceStencilDescriptor, 0);
|
||||
MTL_RELEASE(m_renderPipelineDescriptor, 0);
|
||||
MTL_RELEASE(m_vertexDescriptor, 0);
|
||||
MTL_RELEASE(m_textureDescriptor, 0);
|
||||
MTL_RELEASE(m_samplerDescriptor, 0);
|
||||
|
||||
#if BX_PLATFORM_VISIONOS
|
||||
if (m_mainFrameBuffer.m_swapChain->m_useLayerRenderer)
|
||||
{
|
||||
ar_session_stop(m_arSession);
|
||||
MTL_RELEASE(m_arSession);
|
||||
MTL_RELEASE(m_worldTracking);
|
||||
MTL_RELEASE(m_deviceAnchor);
|
||||
MTL_RELEASE(m_arSession, 0);
|
||||
MTL_RELEASE(m_worldTracking, 0);
|
||||
MTL_RELEASE(m_deviceAnchor, 0);
|
||||
}
|
||||
#endif // BX_PLATFORM_VISIONOS
|
||||
|
||||
m_mainFrameBuffer.destroy();
|
||||
|
||||
for (uint8_t i=0; i < BGFX_CONFIG_MAX_FRAME_LATENCY; ++i)
|
||||
{
|
||||
MTL_RELEASE(m_uniformBuffers[i]);
|
||||
}
|
||||
|
||||
m_cmd.shutdown();
|
||||
|
||||
MTL_RELEASE(m_device);
|
||||
for (uint8_t ii = 0; ii < BGFX_CONFIG_MAX_FRAME_LATENCY; ++ii)
|
||||
{
|
||||
MTL_RELEASE_W(m_uniformBuffers[ii], 0);
|
||||
}
|
||||
|
||||
MTL_RELEASE_W(m_device, 0);
|
||||
}
|
||||
|
||||
RendererType::Enum getRendererType() const override
|
||||
@@ -1421,7 +1427,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
RenderCommandEncoder rce = m_commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor);
|
||||
m_renderCommandEncoder = rce;
|
||||
m_renderCommandEncoderFrameBufferHandle = fbh;
|
||||
MTL_RELEASE(renderPassDescriptor);
|
||||
MTL_RELEASE(renderPassDescriptor, 0);
|
||||
|
||||
#if BX_PLATFORM_VISIONOS
|
||||
if (m_mainFrameBuffer.m_swapChain->m_useLayerRenderer)
|
||||
@@ -1541,7 +1547,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
if (NULL != frameBuffer.m_swapChain
|
||||
&& frameBuffer.m_swapChain->m_drawableTexture)
|
||||
{
|
||||
MTL_RELEASE(frameBuffer.m_swapChain->m_drawableTexture);
|
||||
MTL_RELEASE_I(frameBuffer.m_swapChain->m_drawableTexture);
|
||||
|
||||
#if BX_PLATFORM_VISIONOS
|
||||
if (frameBuffer.m_swapChain->m_useLayerRenderer)
|
||||
@@ -1564,13 +1570,13 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
if (NULL != frameBuffer.m_swapChain->m_drawable)
|
||||
{
|
||||
m_commandBuffer.presentDrawable(frameBuffer.m_swapChain->m_drawable);
|
||||
MTL_RELEASE(frameBuffer.m_swapChain->m_drawable);
|
||||
MTL_RELEASE_I(frameBuffer.m_swapChain->m_drawable);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_cmd.kick(true);
|
||||
m_cmd.kick(true, false);
|
||||
m_commandBuffer = 0;
|
||||
}
|
||||
|
||||
@@ -1616,7 +1622,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
|
||||
if (prevMetalLayerPixelFormat != getSwapChainPixelFormat(m_mainFrameBuffer.m_swapChain) )
|
||||
{
|
||||
MTL_RELEASE(m_screenshotBlitRenderPipelineState);
|
||||
MTL_RELEASE_I(m_screenshotBlitRenderPipelineState);
|
||||
reset(m_renderPipelineDescriptor);
|
||||
|
||||
m_renderPipelineDescriptor.colorAttachments[0].pixelFormat = getSwapChainPixelFormat(m_mainFrameBuffer.m_swapChain);
|
||||
@@ -1724,7 +1730,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
}
|
||||
|
||||
m_renderCommandEncoder = m_commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor);
|
||||
MTL_RELEASE(renderPassDescriptor);
|
||||
MTL_RELEASE(renderPassDescriptor, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2007,6 +2013,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
: swapChain->currentDrawableTexture()
|
||||
;
|
||||
}
|
||||
|
||||
#if BX_PLATFORM_VISIONOS
|
||||
if (m_mainFrameBuffer.m_swapChain->m_useLayerRenderer)
|
||||
{
|
||||
@@ -2153,15 +2160,17 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
m_renderCommandEncoder.setStencilReferenceValue(ref);
|
||||
}
|
||||
|
||||
BX_PRAGMA_DIAGNOSTIC_PUSH();
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wunguarded-availability-new");
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wincompatible-pointer-types");
|
||||
void processArguments(
|
||||
PipelineStateMtl* ps
|
||||
, NSArray<id<MTLBinding>>* _vertexArgs
|
||||
, NSArray<id<MTLBinding>>* _fragmentArgs
|
||||
)
|
||||
{
|
||||
BX_PRAGMA_DIAGNOSTIC_PUSH();
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wunguarded-availability-new");
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wincompatible-pointer-types");
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wdeprecated-declarations");
|
||||
|
||||
ps->m_numPredefined = 0;
|
||||
|
||||
for (uint32_t shaderType = 0; shaderType < 2; ++shaderType)
|
||||
@@ -2323,8 +2332,8 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
constantBuffer->finish();
|
||||
}
|
||||
}
|
||||
BX_PRAGMA_DIAGNOSTIC_POP();
|
||||
}
|
||||
BX_PRAGMA_DIAGNOSTIC_POP();
|
||||
|
||||
PipelineStateMtl* getPipelineState(
|
||||
uint64_t _state
|
||||
@@ -2516,7 +2525,11 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
}
|
||||
|
||||
pd.vertexFunction = program.m_vsh->m_function;
|
||||
pd.fragmentFunction = program.m_fsh != NULL ? program.m_fsh->m_function : NULL;
|
||||
pd.fragmentFunction = program.m_fsh != NULL
|
||||
? program.m_fsh->m_function
|
||||
: NULL
|
||||
;
|
||||
|
||||
#if BX_PLATFORM_VISIONOS
|
||||
if (m_mainFrameBuffer.m_swapChain->m_useLayerRenderer)
|
||||
{
|
||||
@@ -2607,9 +2620,11 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
|
||||
if (NULL != reflection)
|
||||
{
|
||||
BX_PRAGMA_DIAGNOSTIC_PUSH();
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wunguarded-availability-new");
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wincompatible-pointer-types");
|
||||
BX_PRAGMA_DIAGNOSTIC_PUSH();
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wunguarded-availability-new");
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wincompatible-pointer-types");
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wdeprecated-declarations");
|
||||
|
||||
if (m_usesMTLBindings)
|
||||
{
|
||||
processArguments(pso, reflection.vertexBindings, reflection.fragmentBindings);
|
||||
@@ -2618,7 +2633,8 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
{
|
||||
processArguments(pso, reflection.vertexArguments, reflection.fragmentArguments);
|
||||
}
|
||||
BX_PRAGMA_DIAGNOSTIC_POP();
|
||||
|
||||
BX_PRAGMA_DIAGNOSTIC_POP();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2666,9 +2682,11 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
, &reflection
|
||||
);
|
||||
|
||||
BX_PRAGMA_DIAGNOSTIC_PUSH();
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wunguarded-availability-new");
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wincompatible-pointer-types");
|
||||
BX_PRAGMA_DIAGNOSTIC_PUSH();
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wunguarded-availability-new");
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wincompatible-pointer-types");
|
||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wdeprecated-declarations");
|
||||
|
||||
if (m_usesMTLBindings)
|
||||
{
|
||||
processArguments(pso, reflection.bindings, NULL);
|
||||
@@ -2677,7 +2695,8 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
{
|
||||
processArguments(pso, reflection.arguments, NULL);
|
||||
}
|
||||
BX_PRAGMA_DIAGNOSTIC_POP();
|
||||
|
||||
BX_PRAGMA_DIAGNOSTIC_POP();
|
||||
|
||||
for (uint32_t ii = 0; ii < 3; ++ii)
|
||||
{
|
||||
@@ -2750,22 +2769,22 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
|
||||
void endEncoding()
|
||||
{
|
||||
if (0 != m_renderCommandEncoder)
|
||||
if (NULL != m_renderCommandEncoder)
|
||||
{
|
||||
m_renderCommandEncoder.endEncoding();
|
||||
m_renderCommandEncoder = 0;
|
||||
m_renderCommandEncoder = NULL;
|
||||
}
|
||||
|
||||
if (0 != m_computeCommandEncoder)
|
||||
if (NULL != m_computeCommandEncoder)
|
||||
{
|
||||
m_computeCommandEncoder.endEncoding();
|
||||
m_computeCommandEncoder = 0;
|
||||
m_computeCommandEncoder = NULL;
|
||||
}
|
||||
|
||||
if (0 != m_blitCommandEncoder)
|
||||
if (NULL != m_blitCommandEncoder)
|
||||
{
|
||||
m_blitCommandEncoder.endEncoding();
|
||||
m_blitCommandEncoder = 0;
|
||||
m_blitCommandEncoder = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2811,7 +2830,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
|
||||
typedef stl::vector<PipelineProgram> PipelineProgramArray;
|
||||
|
||||
PipelineProgramArray m_pipelineProgram;
|
||||
PipelineProgramArray m_pipelineProgram;
|
||||
|
||||
StateCacheT<PipelineStateMtl*> m_pipelineStateCache;
|
||||
StateCacheT<DepthStencilState> m_depthStencilStateCache;
|
||||
@@ -3425,8 +3444,17 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
{ _rect.m_width, _rect.m_height, _depth },
|
||||
};
|
||||
tempTexture.replaceRegion(region, 0, 0, data, srcpitch, srcpitch * _rect.m_height);
|
||||
bce.copyFromTexture(tempTexture, 0, 0, MTLOriginMake(0,0,0), MTLSizeMake(_rect.m_width, _rect.m_height, _depth),
|
||||
m_ptr, slice, _mip, MTLOriginMake(_rect.m_x, _rect.m_y, zz) );
|
||||
bce.copyFromTexture(
|
||||
tempTexture
|
||||
, 0
|
||||
, 0
|
||||
, MTLOriginMake(0,0,0)
|
||||
, MTLSizeMake(_rect.m_width, _rect.m_height, _depth)
|
||||
, m_ptr
|
||||
, slice
|
||||
, _mip
|
||||
, MTLOriginMake(_rect.m_x, _rect.m_y, zz)
|
||||
);
|
||||
release(tempTexture);
|
||||
}
|
||||
|
||||
@@ -3494,24 +3522,21 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
return m_ptrMips[_mip];
|
||||
}
|
||||
|
||||
return nil;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SwapChainMtl::~SwapChainMtl()
|
||||
{
|
||||
#if BX_PLATFORM_VISIONOS
|
||||
MTL_RELEASE(m_layerRenderer);
|
||||
MTL_RELEASE(m_layerRenderer, 0);
|
||||
#else
|
||||
MTL_RELEASE(m_metalLayer);
|
||||
MTL_RELEASE(m_drawable);
|
||||
MTL_RELEASE(m_metalLayer, 2);
|
||||
MTL_RELEASE(m_drawable, 0);
|
||||
#endif // BX_PLATFORM_VISIONOS
|
||||
|
||||
MTL_RELEASE(m_drawableTexture);
|
||||
MTL_RELEASE(m_drawableTexture, 0);
|
||||
|
||||
MTL_RELEASE(m_backBufferDepth);
|
||||
MTL_RELEASE(m_backBufferStencil);
|
||||
|
||||
MTL_RELEASE(m_backBufferColorMsaa);
|
||||
releaseBackBuffer();
|
||||
}
|
||||
|
||||
void SwapChainMtl::init(void* _nwh)
|
||||
@@ -3537,7 +3562,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
else
|
||||
#endif // BX_PLATFORM_VISIONOS
|
||||
{
|
||||
MTL_RELEASE(m_metalLayer);
|
||||
MTL_RELEASE(m_metalLayer, 2);
|
||||
|
||||
#if !BX_PLATFORM_VISIONOS
|
||||
if (NULL != NSClassFromString(@"MTKView") )
|
||||
@@ -3653,8 +3678,17 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
m_nwh = _nwh;
|
||||
}
|
||||
|
||||
void SwapChainMtl::releaseBackBuffer()
|
||||
{
|
||||
MTL_RELEASE(m_backBufferStencil, m_backBufferDepth == m_backBufferStencil ? 1 : 0);
|
||||
MTL_RELEASE_W(m_backBufferDepth, 0);
|
||||
MTL_RELEASE(m_backBufferColorMsaa, 0);
|
||||
}
|
||||
|
||||
uint32_t SwapChainMtl::resize(uint32_t _width, uint32_t _height, TextureFormat::Enum _format, TextureFormat::Enum _depthFormat)
|
||||
{
|
||||
releaseBackBuffer();
|
||||
|
||||
const Resolution& resolution = s_renderMtl->m_resolution;
|
||||
|
||||
const uint32_t resetFlags = resolution.reset;
|
||||
@@ -3670,24 +3704,6 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
|
||||
const int32_t sampleCount = s_msaa[(resetFlags & BGFX_RESET_MSAA_MASK)>>BGFX_RESET_MSAA_SHIFT];
|
||||
|
||||
if (NULL != m_backBufferDepth)
|
||||
{
|
||||
release(m_backBufferDepth);
|
||||
m_backBufferDepth = NULL;
|
||||
}
|
||||
|
||||
if (NULL != m_backBufferStencil)
|
||||
{
|
||||
release(m_backBufferStencil);
|
||||
m_backBufferStencil = NULL;
|
||||
}
|
||||
|
||||
if (NULL != m_backBufferColorMsaa)
|
||||
{
|
||||
release(m_backBufferColorMsaa);
|
||||
m_backBufferColorMsaa = NULL;
|
||||
}
|
||||
|
||||
#if BX_PLATFORM_OSX
|
||||
# if __MAC_OS_X_VERSION_MAX_ALLOWED >= 101300
|
||||
if (s_renderMtl->m_hasVSync)
|
||||
@@ -3761,13 +3777,19 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
if (MTLPixelFormatDepth24Unorm_Stencil8 == depthFormat
|
||||
|| MTLPixelFormatDepth32Float_Stencil8 == depthFormat)
|
||||
{
|
||||
m_backBufferDepth.setLabel("SwapChain BackBuffer Depth/Stencil");
|
||||
|
||||
m_backBufferStencil = m_backBufferDepth;
|
||||
retain(m_backBufferStencil);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_backBufferDepth.setLabel("SwapChain BackBuffer Depth");
|
||||
|
||||
desc.pixelFormat = MTLPixelFormatStencil8;
|
||||
|
||||
m_backBufferStencil = s_renderMtl->m_device.newTextureWithDescriptor(desc);
|
||||
m_backBufferStencil.setLabel("SwapChain BackBuffer Stencil");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3775,6 +3797,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
{
|
||||
desc.pixelFormat = m_metalLayer.pixelFormat;
|
||||
m_backBufferColorMsaa = s_renderMtl->m_device.newTextureWithDescriptor(desc);
|
||||
m_backBufferColorMsaa.setLabel("SwapChain BackBuffer Color MSAA");
|
||||
}
|
||||
|
||||
bx::HashMurmur2A murmur;
|
||||
@@ -3793,7 +3816,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
return murmur.end();
|
||||
}
|
||||
|
||||
id <MTLTexture> SwapChainMtl::currentDrawableTexture()
|
||||
id<MTLTexture> SwapChainMtl::currentDrawableTexture()
|
||||
{
|
||||
if (NULL == m_drawableTexture)
|
||||
{
|
||||
@@ -3801,10 +3824,15 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
if (m_useLayerRenderer)
|
||||
{
|
||||
m_frame = cp_layer_renderer_query_next_frame(m_layerRenderer);
|
||||
if (m_frame)
|
||||
|
||||
if (NULL != m_frame)
|
||||
{
|
||||
cp_frame_timing_t timing = cp_frame_predict_timing(m_frame);
|
||||
if (timing == nullptr) { return nullptr; }
|
||||
|
||||
if (NULL == timing)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cp_frame_start_update(m_frame);
|
||||
|
||||
@@ -3832,6 +3860,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
}
|
||||
else
|
||||
#endif // BX_PLATFORM_VISIONOS
|
||||
|
||||
if (m_drawable != NULL)
|
||||
{
|
||||
m_drawableTexture = m_drawable.texture;
|
||||
@@ -3873,6 +3902,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
}
|
||||
|
||||
m_drawableTexture = s_renderMtl->m_device.newTextureWithDescriptor(desc);
|
||||
MTL_CHECK_REFCOUNT(m_drawableTexture, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4023,7 +4053,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
void CommandQueueMtl::shutdown()
|
||||
{
|
||||
finish(true);
|
||||
MTL_RELEASE(m_commandQueue);
|
||||
MTL_RELEASE_W(m_commandQueue, 0);
|
||||
}
|
||||
|
||||
CommandBuffer CommandQueueMtl::alloc()
|
||||
@@ -4060,7 +4090,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
m_activeCommandBuffer.waitUntilCompleted();
|
||||
}
|
||||
|
||||
MTL_RELEASE(m_activeCommandBuffer);
|
||||
MTL_RELEASE_I(m_activeCommandBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4165,7 +4195,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
|
||||
void OcclusionQueryMTL::postReset()
|
||||
{
|
||||
MTL_RELEASE(m_buffer);
|
||||
MTL_RELEASE_W(m_buffer, 0);
|
||||
}
|
||||
|
||||
void OcclusionQueryMTL::preReset()
|
||||
@@ -4245,7 +4275,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
const TextureMtl& dst = m_textures[blit.m_dst.idx];
|
||||
|
||||
#if BX_PLATFORM_OSX
|
||||
bool readBack = !!(dst.m_flags & BGFX_TEXTURE_READ_BACK);
|
||||
const bool readBack = !!(dst.m_flags & BGFX_TEXTURE_READ_BACK);
|
||||
#endif // BX_PLATFORM_OSX
|
||||
|
||||
if (MTLTextureType3D == src.m_ptr.textureType() )
|
||||
@@ -4329,7 +4359,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
if (m_screenshotTarget.width() != m_resolution.width
|
||||
|| m_screenshotTarget.height() != m_resolution.height)
|
||||
{
|
||||
MTL_RELEASE(m_screenshotTarget);
|
||||
MTL_RELEASE(m_screenshotTarget, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4365,7 +4395,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
}
|
||||
else
|
||||
{
|
||||
MTL_RELEASE(m_screenshotTarget);
|
||||
MTL_RELEASE(m_screenshotTarget, 0);
|
||||
}
|
||||
|
||||
m_uniformBuffer = m_uniformBuffers[m_bufferIndex];
|
||||
@@ -4643,7 +4673,8 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
rce = m_commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor);
|
||||
m_renderCommandEncoder = rce;
|
||||
m_renderCommandEncoderFrameBufferHandle = fbh;
|
||||
MTL_RELEASE(renderPassDescriptor);
|
||||
|
||||
MTL_RELEASE(renderPassDescriptor, 0);
|
||||
}
|
||||
else if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION) )
|
||||
{
|
||||
@@ -5171,40 +5202,41 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
switch (bind.m_type)
|
||||
{
|
||||
case Binding::Image:
|
||||
{
|
||||
if (bind.m_access == Access::ReadWrite && 0 == (g_caps.supported & BGFX_CAPS_IMAGE_RW) )
|
||||
{
|
||||
BGFX_FATAL(
|
||||
false
|
||||
, Fatal::DebugCheck
|
||||
, "Failed to set image with access: Access::ReadWrite, device is not support image read&write"
|
||||
if (bind.m_access == Access::ReadWrite && 0 == (g_caps.supported & BGFX_CAPS_IMAGE_RW) )
|
||||
{
|
||||
BGFX_FATAL(
|
||||
false
|
||||
, Fatal::DebugCheck
|
||||
, "Failed to set image with access: Access::ReadWrite, device is not support image read&write"
|
||||
);
|
||||
}
|
||||
|
||||
if ( (bind.m_access == Access::Read && (0 == (g_caps.formats[bind.m_format] & BGFX_CAPS_FORMAT_TEXTURE_IMAGE_READ) ) )
|
||||
|| (bind.m_access == Access::Write && (0 == (g_caps.formats[bind.m_format] & BGFX_CAPS_FORMAT_TEXTURE_IMAGE_WRITE) ) )
|
||||
|| (bind.m_access == Access::ReadWrite && (0 == (g_caps.formats[bind.m_format] & (BGFX_CAPS_FORMAT_TEXTURE_IMAGE_READ|BGFX_CAPS_FORMAT_TEXTURE_IMAGE_WRITE) ) ) )
|
||||
)
|
||||
{
|
||||
BGFX_FATAL(
|
||||
false
|
||||
, Fatal::DebugCheck
|
||||
, "Failed to set image with access: %s, format:%s is not supported"
|
||||
, s_accessNames[bind.m_access]
|
||||
, bimg::getName(bimg::TextureFormat::Enum(bind.m_format) )
|
||||
);
|
||||
}
|
||||
|
||||
TextureMtl& texture = m_textures[bind.m_idx];
|
||||
texture.commit(
|
||||
stage
|
||||
, 0 != (bindingTypes[stage] & PipelineStateMtl::BindToVertexShader)
|
||||
, 0 != (bindingTypes[stage] & PipelineStateMtl::BindToFragmentShader)
|
||||
, bind.m_samplerFlags
|
||||
, bind.m_mip
|
||||
);
|
||||
}
|
||||
break;
|
||||
|
||||
if ( (bind.m_access == Access::Read && (0 == (g_caps.formats[bind.m_format] & BGFX_CAPS_FORMAT_TEXTURE_IMAGE_READ) ) )
|
||||
|| (bind.m_access == Access::Write && (0 == (g_caps.formats[bind.m_format] & BGFX_CAPS_FORMAT_TEXTURE_IMAGE_WRITE) ) )
|
||||
|| (bind.m_access == Access::ReadWrite && (0 == (g_caps.formats[bind.m_format] & (BGFX_CAPS_FORMAT_TEXTURE_IMAGE_READ|BGFX_CAPS_FORMAT_TEXTURE_IMAGE_WRITE) ) ) )
|
||||
)
|
||||
{
|
||||
BGFX_FATAL(
|
||||
false
|
||||
, Fatal::DebugCheck
|
||||
, "Failed to set image with access: %s, format:%s is not supported"
|
||||
, s_accessNames[bind.m_access]
|
||||
, bimg::getName(bimg::TextureFormat::Enum(bind.m_format) )
|
||||
);
|
||||
}
|
||||
|
||||
TextureMtl& texture = m_textures[bind.m_idx];
|
||||
texture.commit(
|
||||
stage
|
||||
, 0 != (bindingTypes[stage] & PipelineStateMtl::BindToVertexShader)
|
||||
, 0 != (bindingTypes[stage] & PipelineStateMtl::BindToFragmentShader)
|
||||
, bind.m_samplerFlags
|
||||
, bind.m_mip
|
||||
);
|
||||
}
|
||||
break;
|
||||
case Binding::Texture:
|
||||
{
|
||||
TextureMtl& texture = m_textures[bind.m_idx];
|
||||
@@ -5525,6 +5557,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
}
|
||||
|
||||
endEncoding();
|
||||
|
||||
m_renderCommandEncoderFrameBufferHandle = BGFX_INVALID_HANDLE;
|
||||
|
||||
if (m_screenshotTarget)
|
||||
@@ -5533,9 +5566,9 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
|
||||
renderPassDescriptor.colorAttachments[0].texture = m_mainFrameBuffer.m_swapChain->currentDrawableTexture();
|
||||
renderPassDescriptor.colorAttachments[0].storeAction = MTLStoreActionStore;
|
||||
|
||||
rce = m_commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor);
|
||||
rce = m_commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor);
|
||||
|
||||
MTL_RELEASE(renderPassDescriptor);
|
||||
MTL_RELEASE(renderPassDescriptor, 0);
|
||||
|
||||
rce.setCullMode(MTLCullModeNone);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user