made single-threaded rendering policies work on iOS devices.

This commit is contained in:
rachytski 2012-01-08 15:23:24 +04:00 committed by Alex Zolotarev
parent e91c24bce5
commit 8a815aaa1e
6 changed files with 42 additions and 31 deletions

View file

@ -113,22 +113,22 @@
- (void)onSize:(int)width withHeight:(int)height
{
/// free old video memory
frameBuffer->resetRenderTarget();
frameBuffer->resetDepthBuffer();
renderBuffer.reset();
frameBuffer->onSize(width, height);
shared_ptr<DrawerYG> drawer = framework->GetRenderPolicy()->GetDrawer();
/// free old video memory
drawer->screen()->resetRenderTarget();
drawer->screen()->resetDepthBuffer();
renderBuffer.reset();
/// allocate the new one
renderBuffer = shared_ptr<iphone::RenderBuffer>(new iphone::RenderBuffer(renderContext, (CAEAGLLayer*)self.layer));
frameBuffer->setRenderTarget(renderBuffer);
frameBuffer->setDepthBuffer(make_shared_ptr(new yg::gl::RenderBuffer(width, height, true)));
framework->OnSize(width, height);
renderBuffer = make_shared_ptr(new iphone::RenderBuffer(renderContext, (CAEAGLLayer*)self.layer));
/* frameBuffer->onSize(width, height);
drawer->onSize(width, height);*/
drawer->screen()->setRenderTarget(renderBuffer);
drawer->screen()->setDepthBuffer(make_shared_ptr(new yg::gl::RenderBuffer(width, height, true)));
shared_ptr<DrawerYG> drawer = framework->GetRenderPolicy()->GetDrawer();
framework->OnSize(width, height);
drawer->screen()->beginFrame();
drawer->screen()->clear(yg::gl::Screen::s_bgColor);

View file

@ -17,8 +17,7 @@ QueuedRenderPolicy::~QueuedRenderPolicy()
delete [] m_Pipelines;
LOG(LINFO, ("resetting state"));
m_state.reset();
LOG(LINFO, ("deleted QueuedRenderPolicy"));
}
bool QueuedRenderPolicy::NeedRedraw() const
@ -50,24 +49,21 @@ void QueuedRenderPolicy::EndFrame(shared_ptr<PaintEvent> const & ev, ScreenBase
void QueuedRenderPolicy::DrawFrame(shared_ptr<PaintEvent> const & ev, ScreenBase const & s)
{
if (!m_state)
{
m_state = ev->drawer()->screen()->createState();
m_state->m_isDebugging = m_IsDebugging;
}
shared_ptr<yg::gl::BaseState> state = ev->drawer()->screen()->createState();
state->m_isDebugging = m_IsDebugging;
ev->drawer()->screen()->getState(m_state.get());
ev->drawer()->screen()->getState(state.get());
for (unsigned i = 0; i < m_PipelinesCount; ++i)
{
RenderQueuedCommands(i);
RenderQueuedCommands(i, state);
m_resourceManager->mergeFreeResources();
}
}
void QueuedRenderPolicy::RenderQueuedCommands(int pipelineNum)
void QueuedRenderPolicy::RenderQueuedCommands(int pipelineNum, shared_ptr<yg::gl::BaseState> const & state)
{
shared_ptr<yg::gl::BaseState> curState = m_state;
shared_ptr<yg::gl::BaseState> curState = state;
unsigned cmdProcessed = 0;
@ -115,7 +111,7 @@ void QueuedRenderPolicy::RenderQueuedCommands(int pipelineNum)
LOG(LINFO, (m_Pipelines[pipelineNum].m_Queue.Size(), "commands left"));
}
m_state->apply(curState.get());
state->apply(curState.get());
}
void QueuedRenderPolicy::PacketsPipeline::FillFrameBucket(list<yg::gl::Packet> & renderQueue, int maxFrames)

View file

@ -30,13 +30,11 @@ private:
bool m_IsDebugging;
shared_ptr<yg::gl::BaseState> m_state;
protected:
void CopyQueuedCommands(list<yg::gl::Packet> & l, list<yg::gl::Packet> & r);
void RenderQueuedCommands(int pipelineNum);
void RenderQueuedCommands(int pipelineNum, shared_ptr<yg::gl::BaseState> const & state);
void DismissQueuedCommands(int pipelineNum);
public:

View file

@ -131,14 +131,14 @@ namespace yg
GLenum res = glCheckFramebufferStatusFn(GL_FRAMEBUFFER_MWM);
OGLCHECKAFTER;
if (res == GL_FRAMEBUFFER_UNSUPPORTED_MWM)
LOG(LINFO, ("unsupported combination of attached target formats. could be possibly skipped"));
LOG(LINFO, ("unsupported combination of attached target formats. could be possibly skipped. id=", m_id));
else if (res == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_MWM)
LOG(LINFO, ("incomplete attachement"));
LOG(LINFO, ("incomplete attachement. id=", m_id));
else if (res == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_MWM)
LOG(LINFO, ("incomplete missing attachement"));
LOG(LINFO, ("incomplete missing attachement. id=", m_id));
else if (res == GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_MWM)
{
LOG(LINFO, ("incomplete dimensions"));
LOG(LINFO, ("incomplete dimensions. id=", m_id));
}
}
}

View file

@ -236,6 +236,13 @@ namespace yg
}
}
void Renderer::resetRenderTarget()
{
m_renderTarget.reset();
if (!m_renderQueue)
m_frameBuffer->resetRenderTarget();
}
shared_ptr<RenderBuffer> const & Renderer::depthBuffer() const
{
return m_depthBuffer;
@ -249,6 +256,14 @@ namespace yg
m_frameBuffer->setDepthBuffer(rt);
}
void Renderer::resetDepthBuffer()
{
m_depthBuffer.reset();
if (!m_renderQueue)
m_frameBuffer->resetDepthBuffer();
}
Renderer::ClearCommand::ClearCommand(yg::Color const & color,
bool clearRT,
float depth,

View file

@ -96,9 +96,11 @@ namespace yg
void setRenderTarget(shared_ptr<RenderTarget> const & rt);
shared_ptr<RenderTarget> const & renderTarget() const;
void resetRenderTarget();
void setDepthBuffer(shared_ptr<RenderBuffer> const & rt);
shared_ptr<RenderBuffer> const & depthBuffer() const;
void resetDepthBuffer();
/// @param clearRT - should we clear the renderTarget data (visible pixels)?
/// @param clearDepth - should we clear depthBuffer data?