mirror of
https://github.com/AxioDL/boo.git
synced 2025-12-13 23:26:16 +00:00
OS X thread-local fixes
This commit is contained in:
@@ -16,7 +16,7 @@ namespace boo
|
||||
{
|
||||
static LogVisor::LogModule Log("boo::GL");
|
||||
|
||||
thread_local struct GLData* GLDataFactory::m_deferredData;
|
||||
ThreadLocalPtr<struct GLData> GLDataFactory::m_deferredData;
|
||||
struct GLData : IGraphicsData
|
||||
{
|
||||
std::vector<std::unique_ptr<class GLShaderPipeline>> m_SPs;
|
||||
@@ -94,9 +94,9 @@ IGraphicsBufferS*
|
||||
GLDataFactory::newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count)
|
||||
{
|
||||
GLGraphicsBufferS* retval = new GLGraphicsBufferS(use, data, stride * count);
|
||||
if (!m_deferredData)
|
||||
m_deferredData = new struct GLData();
|
||||
static_cast<GLData*>(m_deferredData)->m_SBufs.emplace_back(retval);
|
||||
if (!m_deferredData.get())
|
||||
m_deferredData.reset(new struct GLData());
|
||||
m_deferredData->m_SBufs.emplace_back(retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -105,9 +105,9 @@ GLDataFactory::newStaticBuffer(BufferUse use, std::unique_ptr<uint8_t[]>&& data,
|
||||
{
|
||||
std::unique_ptr<uint8_t[]> d = std::move(data);
|
||||
GLGraphicsBufferS* retval = new GLGraphicsBufferS(use, d.get(), stride * count);
|
||||
if (!m_deferredData)
|
||||
m_deferredData = new struct GLData();
|
||||
static_cast<GLData*>(m_deferredData)->m_SBufs.emplace_back(retval);
|
||||
if (!m_deferredData.get())
|
||||
m_deferredData.reset(new struct GLData());
|
||||
m_deferredData->m_SBufs.emplace_back(retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -249,9 +249,9 @@ GLDataFactory::newStaticTexture(size_t width, size_t height, size_t mips, Textur
|
||||
const void* data, size_t sz)
|
||||
{
|
||||
GLTextureS* retval = new GLTextureS(width, height, mips, fmt, data, sz);
|
||||
if (!m_deferredData)
|
||||
m_deferredData = new struct GLData();
|
||||
static_cast<GLData*>(m_deferredData)->m_STexs.emplace_back(retval);
|
||||
if (!m_deferredData.get())
|
||||
m_deferredData.reset(new struct GLData());
|
||||
m_deferredData->m_STexs.emplace_back(retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -261,9 +261,9 @@ GLDataFactory::newStaticTexture(size_t width, size_t height, size_t mips, Textur
|
||||
{
|
||||
std::unique_ptr<uint8_t[]> d = std::move(data);
|
||||
GLTextureS* retval = new GLTextureS(width, height, mips, fmt, d.get(), sz);
|
||||
if (!m_deferredData)
|
||||
m_deferredData = new struct GLData();
|
||||
static_cast<GLData*>(m_deferredData)->m_STexs.emplace_back(retval);
|
||||
if (!m_deferredData.get())
|
||||
m_deferredData.reset(new struct GLData());
|
||||
m_deferredData->m_STexs.emplace_back(retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -272,9 +272,9 @@ GLDataFactory::newStaticArrayTexture(size_t width, size_t height, size_t layers,
|
||||
const void *data, size_t sz)
|
||||
{
|
||||
GLTextureSA* retval = new GLTextureSA(width, height, layers, fmt, data, sz);
|
||||
if (!m_deferredData)
|
||||
m_deferredData = new struct GLData();
|
||||
static_cast<GLData*>(m_deferredData)->m_SATexs.emplace_back(retval);
|
||||
if (!m_deferredData.get())
|
||||
m_deferredData.reset(new struct GLData());
|
||||
m_deferredData->m_SATexs.emplace_back(retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -473,9 +473,9 @@ IShaderPipeline* GLDataFactory::newShaderPipeline
|
||||
}
|
||||
|
||||
GLShaderPipeline* retval = new GLShaderPipeline(std::move(shader));
|
||||
if (!m_deferredData)
|
||||
m_deferredData = new struct GLData();
|
||||
static_cast<GLData*>(m_deferredData)->m_SPs.emplace_back(retval);
|
||||
if (!m_deferredData.get())
|
||||
m_deferredData.reset(new struct GLData());
|
||||
m_deferredData->m_SPs.emplace_back(retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -569,9 +569,9 @@ GLDataFactory::newShaderDataBinding(IShaderPipeline* pipeline,
|
||||
{
|
||||
GLShaderDataBinding* retval =
|
||||
new GLShaderDataBinding(pipeline, vtxFormat, ubufCount, ubufs, texCount, texs);
|
||||
if (!m_deferredData)
|
||||
m_deferredData = new struct GLData();
|
||||
static_cast<GLData*>(m_deferredData)->m_SBinds.emplace_back(retval);
|
||||
if (!m_deferredData.get())
|
||||
m_deferredData.reset(new struct GLData());
|
||||
m_deferredData->m_SBinds.emplace_back(retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -580,21 +580,21 @@ GLDataFactory::GLDataFactory(IGraphicsContext* parent)
|
||||
|
||||
void GLDataFactory::reset()
|
||||
{
|
||||
delete static_cast<GLData*>(m_deferredData);
|
||||
m_deferredData = nullptr;
|
||||
delete m_deferredData.get();
|
||||
m_deferredData.reset();
|
||||
}
|
||||
|
||||
GraphicsDataToken GLDataFactory::commit()
|
||||
{
|
||||
if (!m_deferredData)
|
||||
if (!m_deferredData.get())
|
||||
return GraphicsDataToken(this, nullptr);
|
||||
std::unique_lock<std::mutex> lk(m_committedMutex);
|
||||
GLData* retval = m_deferredData;
|
||||
GLData* retval = m_deferredData.get();
|
||||
#ifndef NDEBUG
|
||||
for (std::unique_ptr<GLShaderDataBinding>& b : retval->m_SBinds)
|
||||
b->m_committed = true;
|
||||
#endif
|
||||
m_deferredData = nullptr;
|
||||
m_deferredData.reset();
|
||||
m_committedData.insert(retval);
|
||||
/* Let's go ahead and flush to ensure our data gets to the GPU
|
||||
While this isn't strictly required, some drivers might behave
|
||||
@@ -1158,9 +1158,9 @@ GLDataFactory::newDynamicBuffer(BufferUse use, size_t stride, size_t count)
|
||||
{
|
||||
GLCommandQueue* q = static_cast<GLCommandQueue*>(m_parent->getCommandQueue());
|
||||
GLGraphicsBufferD* retval = new GLGraphicsBufferD(q, use, stride * count);
|
||||
if (!m_deferredData)
|
||||
m_deferredData = new struct GLData();
|
||||
static_cast<GLData*>(m_deferredData)->m_DBufs.emplace_back(retval);
|
||||
if (!m_deferredData.get())
|
||||
m_deferredData.reset(new struct GLData());
|
||||
m_deferredData->m_DBufs.emplace_back(retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -1235,9 +1235,9 @@ GLDataFactory::newDynamicTexture(size_t width, size_t height, TextureFormat fmt)
|
||||
{
|
||||
GLCommandQueue* q = static_cast<GLCommandQueue*>(m_parent->getCommandQueue());
|
||||
GLTextureD* retval = new GLTextureD(q, width, height, fmt);
|
||||
if (!m_deferredData)
|
||||
m_deferredData = new struct GLData();
|
||||
static_cast<GLData*>(m_deferredData)->m_DTexs.emplace_back(retval);
|
||||
if (!m_deferredData.get())
|
||||
m_deferredData.reset(new struct GLData());
|
||||
m_deferredData->m_DTexs.emplace_back(retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -1259,9 +1259,9 @@ GLDataFactory::newRenderTexture(size_t width, size_t height, size_t samples)
|
||||
GLCommandQueue* q = static_cast<GLCommandQueue*>(m_parent->getCommandQueue());
|
||||
GLTextureR* retval = new GLTextureR(q, width, height, samples);
|
||||
q->resizeRenderTexture(retval, width, height);
|
||||
if (!m_deferredData)
|
||||
m_deferredData = new struct GLData();
|
||||
static_cast<GLData*>(m_deferredData)->m_RTexs.emplace_back(retval);
|
||||
if (!m_deferredData.get())
|
||||
m_deferredData.reset(new struct GLData());
|
||||
m_deferredData->m_RTexs.emplace_back(retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -1282,9 +1282,9 @@ IVertexFormat* GLDataFactory::newVertexFormat
|
||||
{
|
||||
GLCommandQueue* q = static_cast<GLCommandQueue*>(m_parent->getCommandQueue());
|
||||
GLVertexFormat* retval = new struct GLVertexFormat(q, elementCount, elements);
|
||||
if (!m_deferredData)
|
||||
m_deferredData = new struct GLData();
|
||||
static_cast<GLData*>(m_deferredData)->m_VFmts.emplace_back(retval);
|
||||
if (!m_deferredData.get())
|
||||
m_deferredData.reset(new struct GLData());
|
||||
m_deferredData->m_VFmts.emplace_back(retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user