Commit 23e3df14 authored by Nathan Heisey's avatar Nathan Heisey

Reduced SEGFAULT occurence on resize?

parent eb58f97b
...@@ -330,7 +330,7 @@ private: ...@@ -330,7 +330,7 @@ private:
SDL_SendWindowEvent(win, SDL_WINDOWEVENT_MOVED, xPos, yPos); SDL_SendWindowEvent(win, SDL_WINDOWEVENT_MOVED, xPos, yPos);
/* FIXME: Attempt at fixing rendering problems */ /* 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) { void _HandleWindowResized(BMessage *msg) {
...@@ -349,7 +349,7 @@ private: ...@@ -349,7 +349,7 @@ private:
SDL_SendWindowEvent(win, SDL_WINDOWEVENT_RESIZED, w, h); SDL_SendWindowEvent(win, SDL_WINDOWEVENT_RESIZED, w, h);
/* FIXME: Attempt at fixing rendering problems */ /* 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) { bool _GetWinID(BMessage *msg, int32 *winID) {
......
...@@ -82,10 +82,11 @@ class SDL_BWin:public BDirectWindow ...@@ -82,10 +82,11 @@ class SDL_BWin:public BDirectWindow
_trash_window_buffer = false; _trash_window_buffer = false;
_buffer_locker = new BLocker(); _buffer_locker = new BLocker();
_bitmap = NULL; _bitmap = NULL;
#ifdef DRAWTHREAD
_draw_thread_id = spawn_thread(BE_DrawThread, "drawing_thread", _draw_thread_id = spawn_thread(BE_DrawThread, "drawing_thread",
B_NORMAL_PRIORITY, (void*) this); B_NORMAL_PRIORITY, (void*) this);
resume_thread(_draw_thread_id); resume_thread(_draw_thread_id);
#endif
} }
virtual ~ SDL_BWin() virtual ~ SDL_BWin()
...@@ -109,7 +110,9 @@ class SDL_BWin:public BDirectWindow ...@@ -109,7 +110,9 @@ class SDL_BWin:public BDirectWindow
/* Clean up framebuffer stuff */ /* Clean up framebuffer stuff */
_buffer_locker->Lock(); _buffer_locker->Lock();
#ifdef DRAWTHREAD
wait_for_thread(_draw_thread_id, &result); wait_for_thread(_draw_thread_id, &result);
#endif
free(_clips); free(_clips);
delete _buffer_locker; delete _buffer_locker;
} }
......
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
extern "C" { extern "C" {
#endif #endif
int32 BE_UpdateOnce(SDL_Window *window);
static inline SDL_BWin *_ToBeWin(SDL_Window *window) { static inline SDL_BWin *_ToBeWin(SDL_Window *window) {
return ((SDL_BWin*)(window->driverdata)); return ((SDL_BWin*)(window->driverdata));
} }
...@@ -98,10 +100,15 @@ int BE_UpdateWindowFramebuffer(_THIS, SDL_Window * window, ...@@ -98,10 +100,15 @@ int BE_UpdateWindowFramebuffer(_THIS, SDL_Window * window,
return 0; return 0;
SDL_BWin *bwin = _ToBeWin(window); SDL_BWin *bwin = _ToBeWin(window);
#ifdef DRAWTHREAD
bwin->LockBuffer(); bwin->LockBuffer();
bwin->SetBufferDirty(true); bwin->SetBufferDirty(true);
bwin->UnlockBuffer(); bwin->UnlockBuffer();
#else
bwin->SetBufferDirty(true);
BE_UpdateOnce(window);
#endif
return 0; return 0;
} }
...@@ -148,9 +155,11 @@ int32 BE_DrawThread(void *data) { ...@@ -148,9 +155,11 @@ int32 BE_DrawThread(void *data) {
buffer */ buffer */
for(y = 0; y < height; ++y) for(y = 0; y < height; ++y)
{ {
if(bwin->CanTrashWindowBuffer()) { if(bwin->CanTrashWindowBuffer()) {
goto escape; /* Break out before the buffer is killed */ goto escape; /* Break out before the buffer is killed */
} }
// printf("memcpy(0x%x, 0x%x, %i) ", bufferpx, windowpx, width * BPP); // printf("memcpy(0x%x, 0x%x, %i) ", bufferpx, windowpx, width * BPP);
memcpy(bufferpx, windowpx, width * BPP); memcpy(bufferpx, windowpx, width * BPP);
bufferpx += bufferPitch; bufferpx += bufferPitch;
...@@ -183,6 +192,55 @@ void BE_DestroyWindowFramebuffer(_THIS, SDL_Window * window) { ...@@ -183,6 +192,55 @@ void BE_DestroyWindowFramebuffer(_THIS, SDL_Window * window) {
bwin->UnlockBuffer(); 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 #ifdef __cplusplus
} }
#endif #endif
...@@ -26,6 +26,8 @@ ...@@ -26,6 +26,8 @@
extern "C" { extern "C" {
#endif #endif
#define DRAWTHREAD
#include "../SDL_sysvideo.h" #include "../SDL_sysvideo.h"
extern int BE_CreateWindowFramebuffer(_THIS, SDL_Window * window, extern int BE_CreateWindowFramebuffer(_THIS, SDL_Window * window,
......
...@@ -48,8 +48,7 @@ int BE_GL_LoadLibrary(_THIS, const char *path) ...@@ -48,8 +48,7 @@ int BE_GL_LoadLibrary(_THIS, const char *path)
void *location = NULL; void *location = NULL;
if( get_image_symbol(info.id, "glBegin", B_SYMBOL_TYPE_ANY, if( get_image_symbol(info.id, "glBegin", B_SYMBOL_TYPE_ANY,
&location) == B_OK) { &location) == B_OK) {
printf("HERE2\n");
_this->gl_config.dll_handle = (void *) info.id; _this->gl_config.dll_handle = (void *) info.id;
_this->gl_config.driver_loaded = 1; _this->gl_config.driver_loaded = 1;
SDL_strlcpy(_this->gl_config.driver_path, "libGL.so", SDL_strlcpy(_this->gl_config.driver_path, "libGL.so",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment