From 3979f76d39150b0ee0d2669b7c475e7f299d407e Mon Sep 17 00:00:00 2001 From: Nathan Heisey Date: Fri, 12 Aug 2011 16:58:54 +0000 Subject: [PATCH] Reduced SEGFAULT occurence on resize? --- src/main/beos/SDL_BApp.h | 4 +- src/video/bwindow/SDL_BWin.h | 5 ++- src/video/bwindow/SDL_bframebuffer.cc | 60 ++++++++++++++++++++++++++- src/video/bwindow/SDL_bframebuffer.h | 2 + src/video/bwindow/SDL_bopengl.cc | 3 +- 5 files changed, 68 insertions(+), 6 deletions(-) diff --git a/src/main/beos/SDL_BApp.h b/src/main/beos/SDL_BApp.h index 053db8b46..a2e504113 100644 --- a/src/main/beos/SDL_BApp.h +++ b/src/main/beos/SDL_BApp.h @@ -330,7 +330,7 @@ private: SDL_SendWindowEvent(win, SDL_WINDOWEVENT_MOVED, xPos, yPos); /* FIXME: Attempt at fixing rendering problems */ - BE_UpdateWindowFramebuffer(NULL,win,NULL,-1); +// BE_UpdateWindowFramebuffer(NULL,win,NULL,-1); Handled by DirectConnected } void _HandleWindowResized(BMessage *msg) { @@ -349,7 +349,7 @@ private: SDL_SendWindowEvent(win, SDL_WINDOWEVENT_RESIZED, w, h); /* FIXME: Attempt at fixing rendering problems */ - BE_UpdateWindowFramebuffer(NULL,win,NULL,-1); +// BE_UpdateWindowFramebuffer(NULL,win,NULL,-1); Handled by DirectConnected } bool _GetWinID(BMessage *msg, int32 *winID) { diff --git a/src/video/bwindow/SDL_BWin.h b/src/video/bwindow/SDL_BWin.h index 3715033e5..192bfc59e 100644 --- a/src/video/bwindow/SDL_BWin.h +++ b/src/video/bwindow/SDL_BWin.h @@ -82,10 +82,11 @@ class SDL_BWin:public BDirectWindow _trash_window_buffer = false; _buffer_locker = new BLocker(); _bitmap = NULL; - +#ifdef DRAWTHREAD _draw_thread_id = spawn_thread(BE_DrawThread, "drawing_thread", B_NORMAL_PRIORITY, (void*) this); resume_thread(_draw_thread_id); +#endif } virtual ~ SDL_BWin() @@ -109,7 +110,9 @@ class SDL_BWin:public BDirectWindow /* Clean up framebuffer stuff */ _buffer_locker->Lock(); +#ifdef DRAWTHREAD wait_for_thread(_draw_thread_id, &result); +#endif free(_clips); delete _buffer_locker; } diff --git a/src/video/bwindow/SDL_bframebuffer.cc b/src/video/bwindow/SDL_bframebuffer.cc index 51a2772c7..afe8df68b 100644 --- a/src/video/bwindow/SDL_bframebuffer.cc +++ b/src/video/bwindow/SDL_bframebuffer.cc @@ -32,6 +32,8 @@ extern "C" { #endif +int32 BE_UpdateOnce(SDL_Window *window); + static inline SDL_BWin *_ToBeWin(SDL_Window *window) { return ((SDL_BWin*)(window->driverdata)); } @@ -98,10 +100,15 @@ int BE_UpdateWindowFramebuffer(_THIS, SDL_Window * window, return 0; SDL_BWin *bwin = _ToBeWin(window); - + +#ifdef DRAWTHREAD bwin->LockBuffer(); bwin->SetBufferDirty(true); bwin->UnlockBuffer(); +#else + bwin->SetBufferDirty(true); + BE_UpdateOnce(window); +#endif return 0; } @@ -148,9 +155,11 @@ int32 BE_DrawThread(void *data) { buffer */ for(y = 0; y < height; ++y) { + if(bwin->CanTrashWindowBuffer()) { goto escape; /* Break out before the buffer is killed */ } + // printf("memcpy(0x%x, 0x%x, %i) ", bufferpx, windowpx, width * BPP); memcpy(bufferpx, windowpx, width * BPP); bufferpx += bufferPitch; @@ -183,6 +192,55 @@ void BE_DestroyWindowFramebuffer(_THIS, SDL_Window * window) { bwin->UnlockBuffer(); } + +int32 BE_UpdateOnce(SDL_Window *window) { + SDL_BWin *bwin = _ToBeWin(window); + BScreen bscreen; + if(!bscreen.IsValid()) { + return -1; + } + + if(bwin->ConnectionEnabled() && bwin->Connected()) { + bwin->LockBuffer(); + int32 windowPitch = window->surface->pitch; + int32 bufferPitch = bwin->GetRowBytes(); + uint8 *windowpx; + uint8 *bufferpx; + + int32 BPP = bwin->GetBytesPerPx(); + uint8 *windowBaseAddress = (uint8*)window->surface->pixels; + int32 windowSub = bwin->GetFbX() * BPP + + bwin->GetFbY() * windowPitch; + clipping_rect *clips = bwin->GetClips(); + int32 numClips = bwin->GetNumClips(); + int i, y; + + /* Blit each clipping rectangle */ + bscreen.WaitForRetrace(); + for(i = 0; i < numClips; ++i) { + clipping_rect rc = clips[i]; + /* Get addresses of the start of each clipping rectangle */ + int32 width = clips[i].right - clips[i].left + 1; + int32 height = clips[i].bottom - clips[i].top + 1; + bufferpx = bwin->GetBufferPx() + + clips[i].top * bufferPitch + clips[i].left * BPP; + windowpx = windowBaseAddress + + clips[i].top * windowPitch + clips[i].left * BPP - windowSub; + + /* Copy each row of pixels from the window buffer into the frame + buffer */ + for(y = 0; y < height; ++y) + { + memcpy(bufferpx, windowpx, width * BPP); + bufferpx += bufferPitch; + windowpx += windowPitch; + } + } + bwin->UnlockBuffer(); + } + return 0; +} + #ifdef __cplusplus } #endif diff --git a/src/video/bwindow/SDL_bframebuffer.h b/src/video/bwindow/SDL_bframebuffer.h index d34b530c0..05efa5b9a 100644 --- a/src/video/bwindow/SDL_bframebuffer.h +++ b/src/video/bwindow/SDL_bframebuffer.h @@ -26,6 +26,8 @@ extern "C" { #endif +#define DRAWTHREAD + #include "../SDL_sysvideo.h" extern int BE_CreateWindowFramebuffer(_THIS, SDL_Window * window, diff --git a/src/video/bwindow/SDL_bopengl.cc b/src/video/bwindow/SDL_bopengl.cc index 9de4eedf9..ed2d1d083 100644 --- a/src/video/bwindow/SDL_bopengl.cc +++ b/src/video/bwindow/SDL_bopengl.cc @@ -48,8 +48,7 @@ int BE_GL_LoadLibrary(_THIS, const char *path) void *location = NULL; if( get_image_symbol(info.id, "glBegin", B_SYMBOL_TYPE_ANY, &location) == B_OK) { - - printf("HERE2\n"); + _this->gl_config.dll_handle = (void *) info.id; _this->gl_config.driver_loaded = 1; SDL_strlcpy(_this->gl_config.driver_path, "libGL.so",