// for debugging use:
-#define SYNC_PAINT
+// #define SYNC_PAINT
#include <unistd.h>
#ifndef SYNC_PAINT
#include <pthread.h>
gRC *gRC::instance=0;
-gRC::gRC(): queue(2048), queuelock(MAXSIZE)
+gRC::gRC(): queue(2048), m_notify_pump(eApp, 0), queuelock(MAXSIZE)
{
ASSERT(!instance);
instance=this;
queuelock.lock(MAXSIZE);
+ CONNECT(m_notify_pump.recv_msg, gRC::recv_notify);
#ifndef SYNC_PAINT
int res = pthread_create(&the_thread, 0, thread_wrapper, this);
if (res)
eFatal("RC thread couldn't be created");
else
- eDebug("RC thread createted successfully");
+ eDebug("RC thread created successfully");
#endif
}
void *gRC::thread()
{
+ int need_notify = 0;
#ifndef SYNC_PAINT
while (1)
#else
gOpcode& o(queue.current());
if (o.opcode==gOpcode::shutdown)
break;
- o.dc->exec(&o);
+ if (o.opcode==gOpcode::notify)
+ need_notify = 1;
+ else
+ o.dc->exec(&o);
o.dc->Release();
queue.dequeue();
+
+ if ((!queue.size()) && need_notify)
+ {
+ need_notify = 0;
+ m_notify_pump.send(1);
+ }
}
#ifndef SYNC_PAINT
pthread_exit(0);
return 0;
}
+void gRC::recv_notify(const int &i)
+{
+ notify();
+}
+
gRC *gRC::getInstance()
{
return instance;
o.parm.blit->pixmap = pixmap;
o.parm.blit->position = pos;
o.parm.blit->clip = clip;
- o.flags=flags;
+ o.parm.blit->flags=flags;
m_rc->submit(o);
}
m_rc->submit(o);
}
+void gPainter::waitVSync()
+{
+ gOpcode o;
+ o.opcode = gOpcode::waitVSync;
+ o.dc = m_dc.grabRef();
+ m_rc->submit(o);
+}
+
+void gPainter::flip()
+{
+ gOpcode o;
+ o.opcode = gOpcode::flip;
+ o.dc = m_dc.grabRef();
+ m_rc->submit(o);
+}
+
+void gPainter::notify()
+{
+ gOpcode o;
+ o.opcode = gOpcode::notify;
+ o.dc = m_dc.grabRef();
+ m_rc->submit(o);
+}
+
void gPainter::end()
{
+ gOpcode o;
+ o.opcode = gOpcode::flush;
+ o.dc = m_dc.grabRef();
+ m_rc->submit(o);
}
gDC::gDC()
m_current_offset = o->parm.setOffset->value;
delete o->parm.setOffset;
break;
+ case gOpcode::waitVSync:
+ break;
+ case gOpcode::flip:
+ break;
case gOpcode::flush:
break;
default:
DEFINE_REF(gDC);
eAutoInitPtr<gRC> init_grc(eAutoInitNumbers::graphic, "gRC");
-