diff --git a/api/boinc_api.C b/api/boinc_api.C index db9a1e7fa9..6f47f18f6a 100644 --- a/api/boinc_api.C +++ b/api/boinc_api.C @@ -18,6 +18,7 @@ // // Code that's in the BOINC app library (but NOT in the core client) +// graphics-related code goes in graphics_api.C, not here #include #include @@ -44,17 +45,6 @@ MMRESULT timer_id; #include #include -#ifdef BOINC_APP_GRAPHICS -#ifdef _WIN32 -HANDLE hQuitEvent; -extern HANDLE graphics_threadh; -extern BOOL win_loop_done; -#endif -#ifdef __APPLE_CC__ -#include -#endif -#endif - #include "parse.h" #include "shmem.h" #include "util.h" @@ -72,7 +62,6 @@ extern void boinc_quit(int sig); #endif static APP_INIT_DATA aid; -GRAPHICS_INFO gi; static double timer_period = 1.0/50.0; // 50 Hz timer static double time_until_checkpoint; static double time_until_fraction_done_update; @@ -131,22 +120,6 @@ int boinc_init(bool standalone_ /* = false */) { } } - f = fopen(GRAPHICS_DATA_FILE, "r"); - if (!f) { - fprintf(stderr, "boinc_init(): can't open graphics data file\n"); - fprintf(stderr, "Using default graphics settings.\n"); - gi.refresh_period = 0.1; // 1/10th of a second - gi.xsize = 640; - gi.ysize = 480; - } else { - retval = parse_graphics_file(f, &gi); - if (retval) { - fprintf(stderr, "boinc_init(): can't parse graphics data file\n"); - return retval; - } - fclose(f); - } - f = fopen(FD_INIT_FILE, "r"); if (f) { parse_fd_init_file(f); @@ -269,15 +242,7 @@ int boinc_finish(int status) { #ifdef _WIN32 // Stop the timer timeKillEvent(timer_id); -#ifdef BOINC_APP_GRAPHICS - if (using_opengl) { - // If the graphics thread is running, tell it to quit and wait for it - win_loop_done = TRUE; - if (hQuitEvent != NULL) { - WaitForSingleObject(hQuitEvent, 1000); // Wait up to 1000 ms - } - } -#endif + boinc_finish_opengl(); #endif cleanup_shared_mem(); exit(status); @@ -447,10 +412,13 @@ void on_timer(int a) { } } +#if 0 + // ???? shouldn't have graphics-related stuff here #if defined __APPLE_CC__ && defined BOINC_APP_GRAPHICS // Yield to the graphics thread to let it draw if needed YieldToAnyThread(); #endif +#endif } @@ -470,16 +438,6 @@ int set_timer(double period) { ); sprintf(buf, "%s%s", QUIT_PREFIX, aid.comm_obj_name); hQuitRequest = OpenEvent(EVENT_ALL_ACCESS, FALSE, buf); -#ifdef BOINC_APP_GRAPHICS - // Create the event object used to signal between the - // worker and event threads - - hQuitEvent = CreateEvent( - NULL, // no security attributes - TRUE, // manual reset event - TRUE, // initial state is signaled - NULL); // object not named -#endif #endif #if HAVE_SIGNAL_H diff --git a/api/graphics_api.C b/api/graphics_api.C index b37ba2b6e1..e6192cd385 100755 --- a/api/graphics_api.C +++ b/api/graphics_api.C @@ -22,32 +22,65 @@ #ifdef _WIN32 #include -DWORD WINAPI win_graphics_event_loop( LPVOID duff ); +extern DWORD WINAPI win_graphics_event_loop( LPVOID duff ); HANDLE graphics_threadh=NULL; #endif -#include "graphics_api.h" -#include "error_numbers.h" - -#include "parse.h" - #include #include -#ifdef __APPLE_CC__ -#include "mac_app_opengl.h" -#endif - #ifdef HAVE_PTHREAD #include #endif -extern GRAPHICS_INFO gi; +#define HAVE_GL_LIB 1 + +#include "parse.h" +#include "app_ipc.h" +#include "graphics_api.h" +#include "error_numbers.h" + +#ifdef __APPLE_CC__ +#include "mac_app_opengl.h" +#endif + + + +GRAPHICS_INFO gi; +bool graphics_inited = false; int boinc_init_opengl() { -#ifdef BOINC_APP_GRAPHICS + FILE* f; + int retval; + + f = fopen(GRAPHICS_DATA_FILE, "r"); + if (!f) { + fprintf(stderr, "boinc_init(): can't open graphics data file\n"); + fprintf(stderr, "Using default graphics settings.\n"); + gi.refresh_period = 0.1; // 1/10th of a second + gi.xsize = 640; + gi.ysize = 480; + } else { + retval = parse_graphics_file(f, &gi); + if (retval) { + fprintf(stderr, "boinc_init(): can't parse graphics data file\n"); + return retval; + } + fclose(f); + } + #ifdef _WIN32 + // Create the event object used to signal between the + // worker and event threads + + hQuitEvent = CreateEvent( + NULL, // no security attributes + TRUE, // manual reset event + TRUE, // initial state is signaled + NULL // object not named + ); + DWORD threadId; // Create the graphics thread, passing it the graphics info @@ -94,7 +127,6 @@ int boinc_init_opengl() { #ifdef _PTHREAD_H pthread_t graphics_thread; pthread_attr_t graphics_thread_attr; - int retval; pthread_attr_init( &graphics_thread_attr ); retval = pthread_create( &graphics_thread, &graphics_thread_attr, p_graphics_loop, &gi ); @@ -102,18 +134,23 @@ int boinc_init_opengl() { pthread_attr_destroy( &graphics_thread_attr ); #endif -#endif - + graphics_inited = true; return 0; } int boinc_finish_opengl() { +#ifdef _WIN32 + if (graphics_inited) { + win_loop_done = TRUE; + if (hQuitEvent != NULL) { + WaitForSingleObject(hQuitEvent, 1000); // Wait up to 1000 ms + } + } +#endif return 0; } -#ifdef BOINC_APP_GRAPHICS - GLvoid glPrint(GLuint font, const char *fmt, ...) // Custom GL "Print" Routine { /* @@ -138,43 +175,52 @@ GLenum InitGL(GLvoid) { // All Setup For OpenGL Goes Here GLenum err; glShadeModel(GL_SMOOTH); // Enable Smooth Shading - if (err=glGetError()) return err; + err = glGetError(); + if (err) return err; glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background - if (err=glGetError()) return err; + err = glGetError(); + if (err) return err; glClearDepth(1.0f); // Depth Buffer Setup - if (err=glGetError()) return err; + err = glGetError(); + if (err) return err; glEnable(GL_DEPTH_TEST); // Enables Depth Testing - if (err=glGetError()) return err; + err = glGetError(); + if (err) return err; glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do - if (err=glGetError()) return err; + err = glGetError(); + if (err) return err; glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations - if (err=glGetError()) return err; + err = glGetError(); + if (err) return err; return GL_NO_ERROR; // Initialization Went OK } -GLenum ReSizeGLScene(GLsizei width, GLsizei height) { // Resize And Initialize The GL Window +// Resize And Initialize The GL Window +// TODO: why is 4/3 hardwired here? +GLenum ReSizeGLScene(GLsizei width, GLsizei height) { GLenum err; double aspect_ratio = 4.0/3.0; - if (height<=0) height=1; // Prevent A Divide By Zero By Making Height Equal One + if (height<=0) height=1; if (width<=0) width=1; - if (height*aspect_ratio > width) - glViewport(0,0,(int)width,(int)(width/aspect_ratio)); // Reset The Current Viewport - else - glViewport(0,0,(int)(height*aspect_ratio),(height)); // Reset The Current Viewport + if (height*aspect_ratio > width) { + glViewport(0,0,(int)width,(int)(width/aspect_ratio)); + } else { + glViewport(0,0,(int)(height*aspect_ratio),(height)); + } - if (err=glGetError()) return err; + err = glGetError(); + if (err) return err; + app_resize(width,height); return GL_NO_ERROR; } - -#endif diff --git a/api/graphics_api.h b/api/graphics_api.h index 2af30280d3..da0c7bf593 100755 --- a/api/graphics_api.h +++ b/api/graphics_api.h @@ -1,11 +1,9 @@ #ifndef BOINC_GRAPHICS_API_H #define BOINC_GRAPHICS_API_H -#include - -#ifdef BOINC_APP_GRAPHICS #ifdef __APPLE_CC__ - #include +#include +#include #endif #ifdef _WIN32 @@ -19,23 +17,21 @@ #include #include "x_opengl.h" #endif + +#ifdef _WIN32 +extern HANDLE hQuitEvent; +extern HANDLE graphics_threadh; +extern BOOL win_loop_done; #endif -#include "app_ipc.h" +extern int boinc_init_opengl(); +extern int boinc_finish_opengl(); -struct APP_OUT_GRAPHICS { -}; - -int boinc_init_opengl(); -int boinc_finish_opengl(); - -#ifdef BOINC_APP_GRAPHICS -GLvoid glPrint(GLuint font, const char *fmt, ...); -GLenum InitGL(GLvoid); -GLenum ReSizeGLScene(GLsizei width, GLsizei height); +extern GLvoid glPrint(GLuint font, const char *fmt, ...); +extern GLenum InitGL(GLvoid); +extern GLenum ReSizeGLScene(GLsizei width, GLsizei height); extern bool app_render(int xs, int ys, double time_of_day); extern void app_init_gl(void); extern void app_resize(int width, int height); -#endif #endif diff --git a/api/windows_opengl.C b/api/windows_opengl.C index 913d059186..283980db3f 100755 --- a/api/windows_opengl.C +++ b/api/windows_opengl.C @@ -1,3 +1,6 @@ +// Event loop and support functions for BOINC applications w/ graphics. +// Is any of this related to or dependent on OpenGL?? +// /* This Code Was Created By Jeff Molofee 2000 * A HUGE Thanks To Fredric Echols For Cleaning Up @@ -57,7 +60,6 @@ double starttime; double fps=60.; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc -DWORD WINAPI win_graphics_event_loop( LPVOID duff ); BOOL reg_win_class(); BOOL unreg_win_class(); diff --git a/api/x_opengl.h b/api/x_opengl.h index 668f851d4d..3a3cbc7bcf 100644 --- a/api/x_opengl.h +++ b/api/x_opengl.h @@ -1,2 +1 @@ -void *p_graphics_loop( void * ); - +extern void *p_graphics_loop( void * ); diff --git a/apps/upper_case.C b/apps/upper_case.C index a343a35e9e..872552e9c8 100755 --- a/apps/upper_case.C +++ b/apps/upper_case.C @@ -53,12 +53,12 @@ #include #endif +#include "graphics_api.h" #endif #include "util.h" #include "filesys.h" #include "boinc_api.h" -#include "graphics_api.h" #define CHECKPOINT_FILE "upper_case_state" diff --git a/checkin_notes b/checkin_notes index 20ef133edc..4e601bb152 100755 --- a/checkin_notes +++ b/checkin_notes @@ -6427,3 +6427,16 @@ David Sept 30 2003 pers_file_xfer.C lib/ error_numbers.h + + +David Sept 30 2003 + - Move graphics-related code from boinc_api.C to graphics_api.C + - Don't use the preprocessor symbol BOINC_APP_GRAPHICS in api/ + + api/ + boinc_api.C + graphics_api.C,h + windows_opengl.C + x_opengl.h + apps/ + upper_case.C