mirror of
https://github.com/AxioDL/boo.git
synced 2025-07-14 00:56:12 +00:00
Metal autorelease pools at API boundaries
This commit is contained in:
parent
d1b980b529
commit
3c207386e7
@ -50,7 +50,7 @@ class MetalDataFactoryImpl : public MetalDataFactory
|
|||||||
void deletePoolBuffer(IGraphicsBufferPool* p, IGraphicsBufferD* buf);
|
void deletePoolBuffer(IGraphicsBufferPool* p, IGraphicsBufferD* buf);
|
||||||
public:
|
public:
|
||||||
MetalDataFactoryImpl(IGraphicsContext* parent, MetalContext* ctx, uint32_t sampleCount);
|
MetalDataFactoryImpl(IGraphicsContext* parent, MetalContext* ctx, uint32_t sampleCount);
|
||||||
~MetalDataFactoryImpl() {}
|
~MetalDataFactoryImpl() = default;
|
||||||
|
|
||||||
Platform platform() const {return Platform::Metal;}
|
Platform platform() const {return Platform::Metal;}
|
||||||
const char* platformName() const {return "Metal";}
|
const char* platformName() const {return "Metal";}
|
||||||
@ -890,12 +890,15 @@ struct MetalCommandQueue : IGraphicsCommandQueue
|
|||||||
MetalShaderDataBinding* m_boundData = nullptr;
|
MetalShaderDataBinding* m_boundData = nullptr;
|
||||||
MTLPrimitiveType m_currentPrimitive = MTLPrimitiveTypeTriangle;
|
MTLPrimitiveType m_currentPrimitive = MTLPrimitiveTypeTriangle;
|
||||||
void setShaderDataBinding(IShaderDataBinding* binding)
|
void setShaderDataBinding(IShaderDataBinding* binding)
|
||||||
|
{
|
||||||
|
@autoreleasepool
|
||||||
{
|
{
|
||||||
MetalShaderDataBinding* cbind = static_cast<MetalShaderDataBinding*>(binding);
|
MetalShaderDataBinding* cbind = static_cast<MetalShaderDataBinding*>(binding);
|
||||||
cbind->bind(m_enc, m_fillBuf);
|
cbind->bind(m_enc, m_fillBuf);
|
||||||
m_boundData = cbind;
|
m_boundData = cbind;
|
||||||
m_currentPrimitive = cbind->m_pipeline->m_drawPrim;
|
m_currentPrimitive = cbind->m_pipeline->m_drawPrim;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
MetalTextureR* m_boundTarget = nullptr;
|
MetalTextureR* m_boundTarget = nullptr;
|
||||||
void _setRenderTarget(ITextureR* target, bool clearColor, bool clearDepth)
|
void _setRenderTarget(ITextureR* target, bool clearColor, bool clearDepth)
|
||||||
@ -1220,6 +1223,8 @@ MetalDataFactoryImpl::MetalDataFactoryImpl(IGraphicsContext* parent, MetalContex
|
|||||||
: m_parent(parent), m_ctx(ctx), m_sampleCount(sampleCount) {}
|
: m_parent(parent), m_ctx(ctx), m_sampleCount(sampleCount) {}
|
||||||
|
|
||||||
IGraphicsBufferS* MetalDataFactory::Context::newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count)
|
IGraphicsBufferS* MetalDataFactory::Context::newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count)
|
||||||
|
{
|
||||||
|
@autoreleasepool
|
||||||
{
|
{
|
||||||
MetalData* d = MetalDataFactoryImpl::m_deferredData.get();
|
MetalData* d = MetalDataFactoryImpl::m_deferredData.get();
|
||||||
MetalDataFactoryImpl& factory = static_cast<MetalDataFactoryImpl&>(m_parent);
|
MetalDataFactoryImpl& factory = static_cast<MetalDataFactoryImpl&>(m_parent);
|
||||||
@ -1227,7 +1232,10 @@ IGraphicsBufferS* MetalDataFactory::Context::newStaticBuffer(BufferUse use, cons
|
|||||||
d->m_SBufs.emplace_back(retval);
|
d->m_SBufs.emplace_back(retval);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
IGraphicsBufferD* MetalDataFactory::Context::newDynamicBuffer(BufferUse use, size_t stride, size_t count)
|
IGraphicsBufferD* MetalDataFactory::Context::newDynamicBuffer(BufferUse use, size_t stride, size_t count)
|
||||||
|
{
|
||||||
|
@autoreleasepool
|
||||||
{
|
{
|
||||||
MetalData* d = MetalDataFactoryImpl::m_deferredData.get();
|
MetalData* d = MetalDataFactoryImpl::m_deferredData.get();
|
||||||
MetalDataFactoryImpl& factory = static_cast<MetalDataFactoryImpl&>(m_parent);
|
MetalDataFactoryImpl& factory = static_cast<MetalDataFactoryImpl&>(m_parent);
|
||||||
@ -1236,9 +1244,12 @@ IGraphicsBufferD* MetalDataFactory::Context::newDynamicBuffer(BufferUse use, siz
|
|||||||
d->m_DBufs.emplace_back(retval);
|
d->m_DBufs.emplace_back(retval);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ITextureS* MetalDataFactory::Context::newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
ITextureS* MetalDataFactory::Context::newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
||||||
TextureClampMode clampMode, const void* data, size_t sz)
|
TextureClampMode clampMode, const void* data, size_t sz)
|
||||||
|
{
|
||||||
|
@autoreleasepool
|
||||||
{
|
{
|
||||||
MetalData* d = MetalDataFactoryImpl::m_deferredData.get();
|
MetalData* d = MetalDataFactoryImpl::m_deferredData.get();
|
||||||
MetalDataFactoryImpl& factory = static_cast<MetalDataFactoryImpl&>(m_parent);
|
MetalDataFactoryImpl& factory = static_cast<MetalDataFactoryImpl&>(m_parent);
|
||||||
@ -1246,9 +1257,12 @@ ITextureS* MetalDataFactory::Context::newStaticTexture(size_t width, size_t heig
|
|||||||
d->m_STexs.emplace_back(retval);
|
d->m_STexs.emplace_back(retval);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
ITextureSA* MetalDataFactory::Context::newStaticArrayTexture(size_t width, size_t height, size_t layers, size_t mips,
|
ITextureSA* MetalDataFactory::Context::newStaticArrayTexture(size_t width, size_t height, size_t layers, size_t mips,
|
||||||
TextureFormat fmt, TextureClampMode clampMode,
|
TextureFormat fmt, TextureClampMode clampMode,
|
||||||
const void* data, size_t sz)
|
const void* data, size_t sz)
|
||||||
|
{
|
||||||
|
@autoreleasepool
|
||||||
{
|
{
|
||||||
MetalData* d = MetalDataFactoryImpl::m_deferredData.get();
|
MetalData* d = MetalDataFactoryImpl::m_deferredData.get();
|
||||||
MetalDataFactoryImpl& factory = static_cast<MetalDataFactoryImpl&>(m_parent);
|
MetalDataFactoryImpl& factory = static_cast<MetalDataFactoryImpl&>(m_parent);
|
||||||
@ -1256,8 +1270,11 @@ ITextureSA* MetalDataFactory::Context::newStaticArrayTexture(size_t width, size_
|
|||||||
d->m_SATexs.emplace_back(retval);
|
d->m_SATexs.emplace_back(retval);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
ITextureD* MetalDataFactory::Context::newDynamicTexture(size_t width, size_t height, TextureFormat fmt,
|
ITextureD* MetalDataFactory::Context::newDynamicTexture(size_t width, size_t height, TextureFormat fmt,
|
||||||
TextureClampMode clampMode)
|
TextureClampMode clampMode)
|
||||||
|
{
|
||||||
|
@autoreleasepool
|
||||||
{
|
{
|
||||||
MetalData* d = MetalDataFactoryImpl::m_deferredData.get();
|
MetalData* d = MetalDataFactoryImpl::m_deferredData.get();
|
||||||
MetalDataFactoryImpl& factory = static_cast<MetalDataFactoryImpl&>(m_parent);
|
MetalDataFactoryImpl& factory = static_cast<MetalDataFactoryImpl&>(m_parent);
|
||||||
@ -1266,8 +1283,11 @@ ITextureD* MetalDataFactory::Context::newDynamicTexture(size_t width, size_t hei
|
|||||||
d->m_DTexs.emplace_back(retval);
|
d->m_DTexs.emplace_back(retval);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
ITextureR* MetalDataFactory::Context::newRenderTexture(size_t width, size_t height, TextureClampMode clampMode,
|
ITextureR* MetalDataFactory::Context::newRenderTexture(size_t width, size_t height, TextureClampMode clampMode,
|
||||||
size_t colorBindCount, size_t depthBindCount)
|
size_t colorBindCount, size_t depthBindCount)
|
||||||
|
{
|
||||||
|
@autoreleasepool
|
||||||
{
|
{
|
||||||
MetalData* d = MetalDataFactoryImpl::m_deferredData.get();
|
MetalData* d = MetalDataFactoryImpl::m_deferredData.get();
|
||||||
MetalDataFactoryImpl& factory = static_cast<MetalDataFactoryImpl&>(m_parent);
|
MetalDataFactoryImpl& factory = static_cast<MetalDataFactoryImpl&>(m_parent);
|
||||||
@ -1276,15 +1296,19 @@ ITextureR* MetalDataFactory::Context::newRenderTexture(size_t width, size_t heig
|
|||||||
d->m_RTexs.emplace_back(retval);
|
d->m_RTexs.emplace_back(retval);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
IVertexFormat* MetalDataFactory::Context::newVertexFormat(size_t elementCount, const VertexElementDescriptor* elements,
|
IVertexFormat* MetalDataFactory::Context::newVertexFormat(size_t elementCount, const VertexElementDescriptor* elements,
|
||||||
size_t baseVert, size_t baseInst)
|
size_t baseVert, size_t baseInst)
|
||||||
|
{
|
||||||
|
@autoreleasepool
|
||||||
{
|
{
|
||||||
MetalData* d = MetalDataFactoryImpl::m_deferredData.get();
|
MetalData* d = MetalDataFactoryImpl::m_deferredData.get();
|
||||||
MetalVertexFormat* retval = new struct MetalVertexFormat(d, elementCount, elements);
|
MetalVertexFormat* retval = new struct MetalVertexFormat(d, elementCount, elements);
|
||||||
d->m_VFmts.emplace_back(retval);
|
d->m_VFmts.emplace_back(retval);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
IShaderPipeline* MetalDataFactory::Context::newShaderPipeline(const char* vertSource, const char* fragSource,
|
IShaderPipeline* MetalDataFactory::Context::newShaderPipeline(const char* vertSource, const char* fragSource,
|
||||||
IVertexFormat* vtxFmt, unsigned targetSamples,
|
IVertexFormat* vtxFmt, unsigned targetSamples,
|
||||||
@ -1374,6 +1398,8 @@ MetalDataFactory::Context::newShaderDataBinding(IShaderPipeline* pipeline,
|
|||||||
size_t texCount, ITexture** texs,
|
size_t texCount, ITexture** texs,
|
||||||
const int* texBindIdxs, const bool* depthBind,
|
const int* texBindIdxs, const bool* depthBind,
|
||||||
size_t baseVert, size_t baseInst)
|
size_t baseVert, size_t baseInst)
|
||||||
|
{
|
||||||
|
@autoreleasepool
|
||||||
{
|
{
|
||||||
MetalDataFactoryImpl& factory = static_cast<MetalDataFactoryImpl&>(m_parent);
|
MetalDataFactoryImpl& factory = static_cast<MetalDataFactoryImpl&>(m_parent);
|
||||||
MetalShaderDataBinding* retval =
|
MetalShaderDataBinding* retval =
|
||||||
@ -1385,6 +1411,7 @@ MetalDataFactory::Context::newShaderDataBinding(IShaderPipeline* pipeline,
|
|||||||
MetalDataFactoryImpl::m_deferredData->m_SBinds.emplace_back(retval);
|
MetalDataFactoryImpl::m_deferredData->m_SBinds.emplace_back(retval);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GraphicsDataToken MetalDataFactoryImpl::commitTransaction(const FactoryCommitFunc& trans)
|
GraphicsDataToken MetalDataFactoryImpl::commitTransaction(const FactoryCommitFunc& trans)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user