Skip to content

Commit

Permalink
GTK plug + multithreaded GTK in OOPP
Browse files Browse the repository at this point in the history
  • Loading branch information
alexp-sssup committed May 14, 2010
1 parent acc8807 commit 0233bab
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 97 deletions.
1 change: 1 addition & 0 deletions plugin-dir/plugin.cpp
Expand Up @@ -374,6 +374,7 @@ NPError nsPluginInstance::SetWindow(NPWindow* aWindow)
p->window=mWindow;
p->width=mWidth;
p->height=mHeight;
p->container=gtk_plug_new((GdkNativeWindow)p->window);
lightspark::NPAPI_params* p2=new lightspark::NPAPI_params(*p);
if(m_rt!=NULL)
{
Expand Down
200 changes: 103 additions & 97 deletions swf.cpp
Expand Up @@ -469,7 +469,15 @@ InputThread::InputThread(SystemState* s,ENGINE e, void* param):m_sys(s),t(0),ter
}
else if(e==GTKPLUG)
{
cout << "input plug" << endl;
gdk_threads_enter();
npapi_params=(NPAPI_params*)param;
GtkWidget* container=npapi_params->container;
gtk_widget_set_can_focus(container,True);
gtk_widget_add_events(container,GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK |
GDK_POINTER_MOTION_MASK | GDK_SCROLL_MASK | GDK_EXPOSURE_MASK | GDK_VISIBILITY_NOTIFY_MASK |
GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK);
g_signal_connect(G_OBJECT(container), "event", G_CALLBACK(gtkplug_worker), this);
gdk_threads_leave();
}
#endif
else
Expand All @@ -490,6 +498,13 @@ void InputThread::wait()
terminated=true;
}

//This is a GTK event handler and the gdk lock is already acquired
gboolean InputThread::gtkplug_worker(GtkWidget *widget, GdkEvent *event, InputThread* th)
{
cout << "Event" << endl;
return False;
}

void InputThread::npapi_worker(X11Intrinsic::Widget xt_w, InputThread* th, XEvent* xevent, lightspark::Boolean* b)
{
if(xevent->type==KeyPress)
Expand Down Expand Up @@ -791,7 +806,7 @@ void* RenderThread::gtkplug_worker(RenderThread* th)
th->interactive_buffer=new uint32_t[window_width*window_height];
unsigned int t2[3];
gdk_threads_enter();
GtkWidget* container=gtk_plug_new((GdkNativeWindow)p->window);;
GtkWidget* container=p->container;
gtk_widget_show(container);
gdk_gl_init(0, 0);
GdkGLConfig* glConfig=gdk_gl_config_new_by_mode((GdkGLConfigMode)(GDK_GL_MODE_RGBA|GDK_GL_MODE_DOUBLE|GDK_GL_MODE_DEPTH));
Expand All @@ -808,28 +823,7 @@ void* RenderThread::gtkplug_worker(RenderThread* th)
bool ret=gdk_gl_drawable_gl_begin(glDrawable,glContext);
assert(ret);
th->commonGLInit(window_width, window_height, t2);
gdk_gl_drawable_gl_end(glDrawable);
gdk_threads_leave();

while(1)
{
gdk_threads_enter();
bool ret=gdk_gl_drawable_gl_begin(glDrawable,glContext);
assert(ret);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDrawBuffer(GL_BACK);
glClearColor(0,0,1,1);
glClear(GL_COLOR_BUFFER_BIT);
gdk_gl_drawable_swap_buffers(glDrawable);
gdk_gl_drawable_gl_end(glDrawable);
gdk_threads_leave();
if(sys->shutdown)
pthread_exit(0);
sleep(1);
}

return NULL;
/*ThreadProfile* profile=sys->allocateProfiler(RGB(200,0,0));
ThreadProfile* profile=sys->allocateProfiler(RGB(200,0,0));
profile->setTag("Render");
FTTextureFont font("/usr/share/fonts/truetype/ttf-liberation/LiberationSerif-Regular.ttf");
if(font.Error())
Expand All @@ -838,13 +832,32 @@ void* RenderThread::gtkplug_worker(RenderThread* th)
font.FaceSize(20);

glEnable(GL_TEXTURE_2D);
gdk_gl_drawable_gl_end(glDrawable);
gdk_threads_leave();
Chronometer chronometer;
try
{
while(1)
{
sem_wait(&th->render);
Chronometer chronometer;
if(th->m_sys->shutdown)
pthread_exit(0);

chronometer.checkpoint();

gdk_threads_enter();
bool ret=gdk_gl_drawable_gl_begin(glDrawable,glContext);
assert(ret);
gdk_gl_drawable_swap_buffers(glDrawable);

if(th->inputNeeded)
{
glBindTexture(GL_TEXTURE_2D,t2[2]);
glGetTexImage(GL_TEXTURE_2D,0,GL_BGRA,GL_UNSIGNED_BYTE,th->interactive_buffer);
th->inputNeeded=false;
sem_post(&th->inputDone);
}

//Before starting rendering, cleanup all the request arrived in the meantime
int fakeRenderCount=0;
while(sem_trywait(&th->render)==0)
Expand All @@ -853,88 +866,77 @@ void* RenderThread::gtkplug_worker(RenderThread* th)
pthread_exit(0);
fakeRenderCount++;
}

if(fakeRenderCount)
LOG(LOG_NO_INFO,"Faking " << fakeRenderCount << " renderings");
if(sys->shutdown)
pthread_exit(0);
if(sys->error)
{
::abort();
}
else
{
glXSwapBuffers(d,p->window);
if(th->inputNeeded)
{
glBindTexture(GL_TEXTURE_2D,t2[2]);
glGetTexImage(GL_TEXTURE_2D,0,GL_BGRA,GL_UNSIGNED_BYTE,th->interactive_buffer);
th->inputNeeded=false;
sem_post(&th->inputDone);
}

glBindFramebuffer(GL_FRAMEBUFFER, rt->fboId);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
RGB bg=sys->getBackground();
glClearColor(bg.Red/255.0F,bg.Green/255.0F,bg.Blue/255.0F,0);
glClearDepth(0xffff);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glScalef(scalex,scaley,1);
sys->Render();
glBindFramebuffer(GL_FRAMEBUFFER, rt->fboId);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
RGB bg=sys->getBackground();
glClearColor(bg.Red/255.0F,bg.Green/255.0F,bg.Blue/255.0F,1);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(th->m_sys->xOffset,th->m_sys->yOffset,0);
glScalef(scalex,scaley,1);

th->m_sys->Render();

glFlush();
glFlush();

glLoadIdentity();
glLoadIdentity();

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDrawBuffer(GL_BACK);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDrawBuffer(GL_BACK);
glUseProgram(0);

glClearColor(0,0,0,1);
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D,((sys->showInteractiveMap)?t2[2]:t2[0]));
glBegin(GL_QUADS);
glTexCoord2f(0,1);
glVertex2i(0,0);
glTexCoord2f(1,1);
glVertex2i(th->width,0);
glTexCoord2f(1,0);
glVertex2i(th->width,th->height);
glTexCoord2f(0,0);
glVertex2i(0,th->height);
glEnd();

if(th->m_sys->showDebug)
{
glDisable(GL_TEXTURE_2D);
th->m_sys->debugRender(&font, true);
glEnable(GL_TEXTURE_2D);
}

glBindTexture(GL_TEXTURE_2D,((sys->showInteractiveMap)?t2[2]:t2[0]));
glColor4f(0,0,1,0);
glBegin(GL_QUADS);
glTexCoord2f(0,1);
glVertex2i(0,0);
glTexCoord2f(1,1);
glVertex2i(th->width,0);
glTexCoord2f(1,0);
glVertex2i(th->width,th->height);
glTexCoord2f(0,0);
glVertex2i(0,th->height);
glEnd();
if(th->m_sys->showProfilingData)
{
glColor3f(0,0,0);
char frameBuf[20];
snprintf(frameBuf,20,"Frame %u",th->m_sys->state.FP);
font.Render(frameBuf,-1,FTPoint(0,0));

if(sys->showProfilingData)
//Draw bars
glColor4f(0.7,0.7,0.7,0.7);
glBegin(GL_LINES);
for(int i=1;i<10;i++)
{
glUseProgram(0);
glDisable(GL_TEXTURE_2D);
//Draw bars
glColor4f(0.7,0.7,0.7,0.7);
glBegin(GL_LINES);
for(int i=1;i<10;i++)
{
glVertex2i(0,(i*th->height/10));
glVertex2i(th->width,(i*th->height/10));
}
glEnd();
list<ThreadProfile>::iterator it=sys->profilingData.begin();
for(;it!=sys->profilingData.end();it++)
it->plot(1000000/sys->getFrameRate(),&font);
glEnable(GL_TEXTURE_2D);
glUseProgram(rt->gpu_program);
glVertex2i(0,(i*th->height/10));
glVertex2i(th->width,(i*th->height/10));
}
//Call glFlush to offload work on the GPU
glFlush();
glEnd();

list<ThreadProfile>::iterator it=th->m_sys->profilingData.begin();
for(;it!=th->m_sys->profilingData.end();it++)
it->plot(1000000/sys->getFrameRate(),&font);
}
//Call glFlush to offload work on the GPU
glFlush();
glUseProgram(th->gpu_program);

gdk_gl_drawable_gl_end(glDrawable);
gdk_threads_leave();

profile->accountTime(chronometer.checkpoint());
}
}
Expand All @@ -943,8 +945,12 @@ void* RenderThread::gtkplug_worker(RenderThread* th)
LOG(LOG_ERROR,"Exception caught " << e);
::abort();
}
ret=gdk_gl_drawable_gl_begin(glDrawable,glContext);
assert(ret);
glDisable(GL_TEXTURE_2D);
delete p;**/
gdk_gl_drawable_gl_end(glDrawable);
delete p;
return NULL;
}
//#endif

Expand Down

0 comments on commit 0233bab

Please sign in to comment.