mirror of https://github.com/BOINC/boinc.git
parent
fa8713feb4
commit
6fab589545
|
@ -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 <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
@ -44,17 +45,6 @@ MMRESULT timer_id;
|
|||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef BOINC_APP_GRAPHICS
|
||||
#ifdef _WIN32
|
||||
HANDLE hQuitEvent;
|
||||
extern HANDLE graphics_threadh;
|
||||
extern BOOL win_loop_done;
|
||||
#endif
|
||||
#ifdef __APPLE_CC__
|
||||
#include <Carbon/Carbon.h>
|
||||
#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
|
||||
|
|
|
@ -22,32 +22,65 @@
|
|||
|
||||
#ifdef _WIN32
|
||||
#include <afxwin.h>
|
||||
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 <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifdef __APPLE_CC__
|
||||
#include "mac_app_opengl.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PTHREAD
|
||||
#include <pthread.h>
|
||||
#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
|
||||
|
|
|
@ -1,11 +1,9 @@
|
|||
#ifndef BOINC_GRAPHICS_API_H
|
||||
#define BOINC_GRAPHICS_API_H
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef BOINC_APP_GRAPHICS
|
||||
#ifdef __APPLE_CC__
|
||||
#include <OpenGL/gl.h>
|
||||
#include <OpenGL/gl.h>
|
||||
#include <Carbon/Carbon.h>
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
|
@ -19,23 +17,21 @@
|
|||
#include <GL/gl.h>
|
||||
#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
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -1,2 +1 @@
|
|||
void *p_graphics_loop( void * );
|
||||
|
||||
extern void *p_graphics_loop( void * );
|
||||
|
|
|
@ -53,12 +53,12 @@
|
|||
#include <GL/glu.h>
|
||||
#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"
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue