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

Reduced SEGFAULT occurence on resize?

parent eb58f97b
......@@ -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) {
......
......@@ -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;
}
......
......@@ -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));
}
......@@ -99,9 +101,14 @@ int BE_UpdateWindowFramebuffer(_THIS, SDL_Window * window,
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
......@@ -26,6 +26,8 @@
extern "C" {
#endif
#define DRAWTHREAD
#include "../SDL_sysvideo.h"
extern int BE_CreateWindowFramebuffer(_THIS, SDL_Window * window,
......
......@@ -49,7 +49,6 @@ int BE_GL_LoadLibrary(_THIS, const char *path)
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",
......
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