Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files

Reduced SEGFAULT occurence on resize?

  • Loading branch information
antifinidictor committed Aug 12, 2011
1 parent a6aea31 commit e1d0eb8de01b56b57e83cecaa8dae986728b5e73
@@ -330,7 +330,7 @@ class SDL_BApp : public BApplication {
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 @@ class SDL_BApp : public BApplication {
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));
}
@@ -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
@@ -26,6 +26,8 @@
extern "C" {
#endif

#define DRAWTHREAD

#include "../SDL_sysvideo.h"

extern int BE_CreateWindowFramebuffer(_THIS, SDL_Window * window,
@@ -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",

0 comments on commit e1d0eb8

Please sign in to comment.