projects
/
goodguy
/
history.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
remove / from shift drop filter, corrent alpha calculation in overlaysample
[goodguy/history.git]
/
cinelerra-5.1
/
guicast
/
bcsynchronous.C
diff --git
a/cinelerra-5.1/guicast/bcsynchronous.C
b/cinelerra-5.1/guicast/bcsynchronous.C
index a8eccf2356298c07765b52a5419f39a2f7ad8302..0bc4f104c3efb543381e7f79952895c6e0c3a55d 100644
(file)
--- a/
cinelerra-5.1/guicast/bcsynchronous.C
+++ b/
cinelerra-5.1/guicast/bcsynchronous.C
@@
-119,8
+119,8
@@
BC_Synchronous::~BC_Synchronous()
{
if( running() ) {
quit();
{
if( running() ) {
quit();
- join();
}
}
+ join();
commands.remove_all_objects();
delete lock_sync;
delete next_command;
commands.remove_all_objects();
delete lock_sync;
delete next_command;
@@
-158,12
+158,9
@@
void BC_Synchronous::quit()
{
if( !is_started ) return;
is_started = 0;
{
if( !is_started ) return;
is_started = 0;
- BC_SynchronousCommand *command = new_command();
+ BC_SynchronousCommand *command =
BC_Synchronous::
new_command();
command->command = BC_SynchronousCommand::QUIT;
command->command = BC_SynchronousCommand::QUIT;
- command_lock->lock("BC_Synchronous::quit");
- commands.append(command);
- command_lock->unlock();
- next_command->unlock();
+ send_garbage(command);
command->command_done->lock("BC_Synchronous::quit");
delete command;
}
command->command_done->lock("BC_Synchronous::quit");
delete command;
}
@@
-218,7
+215,8
@@
void BC_Synchronous::handle_command_base(BC_SynchronousCommand *command)
case BC_SynchronousCommand::DELETE_WINDOW:
delete_window_sync(command);
case BC_SynchronousCommand::DELETE_WINDOW:
delete_window_sync(command);
- break;
+ command->command_done->unlock();
+ return;
case BC_SynchronousCommand::DELETE_PIXMAP:
delete_pixmap_sync(command);
case BC_SynchronousCommand::DELETE_PIXMAP:
delete_pixmap_sync(command);
@@
-367,7
+365,7
@@
void BC_Synchronous::dump_shader(unsigned int handle)
void BC_Synchronous::delete_window(BC_WindowBase *window)
{
#ifdef HAVE_GL
void BC_Synchronous::delete_window(BC_WindowBase *window)
{
#ifdef HAVE_GL
- BC_SynchronousCommand *command = new_command();
+ BC_SynchronousCommand *command =
BC_Synchronous::
new_command();
command->command = BC_SynchronousCommand::DELETE_WINDOW;
command->window_id = window->get_id();
command->display = window->get_display();
command->command = BC_SynchronousCommand::DELETE_WINDOW;
command->window_id = window->get_id();
command->display = window->get_display();
@@
-376,6
+374,8
@@
void BC_Synchronous::delete_window(BC_WindowBase *window)
command->glx_context = window->glx_win_context;
send_garbage(command);
command->glx_context = window->glx_win_context;
send_garbage(command);
+ command->command_done->lock("BC_Synchronous::quit");
+ delete command;
#endif
}
#endif
}
@@
-384,7
+384,7
@@
void BC_Synchronous::delete_window_sync(BC_SynchronousCommand *command)
#ifdef HAVE_GL
int window_id = command->window_id;
Display *display = command->display;
#ifdef HAVE_GL
int window_id = command->window_id;
Display *display = command->display;
-
Window win = command->win;
+
//
Window win = command->win;
GLXWindow glx_win = command->glx_win;
GLXContext glx_context = command->glx_context;
XLockDisplay(display);
GLXWindow glx_win = command->glx_win;
GLXContext glx_context = command->glx_context;
XLockDisplay(display);
@@
-435,10
+435,12
@@
void BC_Synchronous::delete_window_sync(BC_SynchronousCommand *command)
table_lock->unlock();
table_lock->unlock();
-
XDestroyWindow(display, win
);
+
glXMakeContextCurrent(display, None, None, 0
);
if( glx_context )
glXDestroyContext(display, glx_context);
if( glx_context )
glXDestroyContext(display, glx_context);
- command->command_done->unlock();
+// causes xerror BadWindow (invalid Window parameter)
+// XDestroyWindow(display, glx_win);
+// win destroyed in bcwindowbase
XUnlockDisplay(display);
#endif
}
XUnlockDisplay(display);
#endif
}
@@
-446,7
+448,7
@@
void BC_Synchronous::delete_window_sync(BC_SynchronousCommand *command)
void BC_Synchronous::delete_display(BC_WindowBase *window)
{
#ifdef HAVE_GL
void BC_Synchronous::delete_display(BC_WindowBase *window)
{
#ifdef HAVE_GL
- BC_SynchronousCommand *command = new_command();
+ BC_SynchronousCommand *command =
BC_Synchronous::
new_command();
command->command = BC_SynchronousCommand::DELETE_DISPLAY;
command->display = window->get_display();
command->command = BC_SynchronousCommand::DELETE_DISPLAY;
command->display = window->get_display();
@@
-473,13
+475,12
@@
void BC_Synchronous::put_pbuffer(int w, int h,
table_lock->lock("BC_Resources::release_textures");
for(int i = 0; i < pbuffer_ids.total; i++) {
PBufferID *ptr = pbuffer_ids.values[i];
table_lock->lock("BC_Resources::release_textures");
for(int i = 0; i < pbuffer_ids.total; i++) {
PBufferID *ptr = pbuffer_ids.values[i];
- if(
ptr->w == w && ptr->h == h && ptr->glx_pbuffer == glx_pbuffer
) {
+ if(
ptr->w == w && ptr->h == h && ptr->glx_pbuffer == glx_pbuffer
) {
exists = 1;
break;
}
}
exists = 1;
break;
}
}
-
if(!exists) {
PBufferID *ptr = new PBufferID(current_window->get_id(),
glx_pbuffer, glx_context, w, h);
if(!exists) {
PBufferID *ptr = new PBufferID(current_window->get_id(),
glx_pbuffer, glx_context, w, h);
@@
-488,10
+489,7
@@
void BC_Synchronous::put_pbuffer(int w, int h,
table_lock->unlock();
}
table_lock->unlock();
}
-GLXPbuffer BC_Synchronous::get_pbuffer(int w,
- int h,
- int *window_id,
- GLXContext *glx_context)
+GLXPbuffer BC_Synchronous::get_pbuffer(int w, int h, GLXContext *glx_context)
{
table_lock->lock("BC_Resources::release_textures");
for(int i = 0; i < pbuffer_ids.total; i++) {
{
table_lock->lock("BC_Resources::release_textures");
for(int i = 0; i < pbuffer_ids.total; i++) {
@@
-500,7
+498,6
@@
GLXPbuffer BC_Synchronous::get_pbuffer(int w,
ptr->window_id == current_window->get_id() ) {
GLXPbuffer result = ptr->glx_pbuffer;
*glx_context = ptr->glx_context;
ptr->window_id == current_window->get_id() ) {
GLXPbuffer result = ptr->glx_pbuffer;
*glx_context = ptr->glx_context;
- *window_id = ptr->window_id;
ptr->in_use = 1;
table_lock->unlock();
return result;
ptr->in_use = 1;
table_lock->unlock();
return result;
@@
-515,7
+512,8
@@
void BC_Synchronous::release_pbuffer(int window_id, GLXPbuffer pbuffer)
table_lock->lock("BC_Resources::release_textures");
for(int i = 0; i < pbuffer_ids.total; i++) {
PBufferID *ptr = pbuffer_ids.values[i];
table_lock->lock("BC_Resources::release_textures");
for(int i = 0; i < pbuffer_ids.total; i++) {
PBufferID *ptr = pbuffer_ids.values[i];
- if(ptr->window_id == window_id) {
+ if( ptr->window_id == window_id &&
+ ptr->glx_pbuffer == pbuffer ) {
ptr->in_use = 0;
}
}
ptr->in_use = 0;
}
}
@@
-525,7
+523,7
@@
void BC_Synchronous::release_pbuffer(int window_id, GLXPbuffer pbuffer)
void BC_Synchronous::delete_pixmap(BC_WindowBase *window,
GLXPixmap glx_pixmap, GLXContext glx_context)
{
void BC_Synchronous::delete_pixmap(BC_WindowBase *window,
GLXPixmap glx_pixmap, GLXContext glx_context)
{
- BC_SynchronousCommand *command = new_command();
+ BC_SynchronousCommand *command =
BC_Synchronous::
new_command();
command->command = BC_SynchronousCommand::DELETE_PIXMAP;
command->window_id = window->get_id();
command->display = window->get_display();
command->command = BC_SynchronousCommand::DELETE_PIXMAP;
command->window_id = window->get_id();
command->display = window->get_display();