/**************************************************************************** * * SciTech Nucleus Graphics Architecture * * Copyright (C) 1991-1998 SciTech Software, Inc. * All rights reserved. * * ====================================================================== * |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW| * | | * |This copyrighted computer code contains proprietary technology | * |owned by SciTech Software, Inc., located at 505 Wall Street, | * |Chico, CA 95928 USA (http://www.scitechsoft.com). | * | | * |The contents of this file are subject to the SciTech Nucleus | * |License; you may *not* use this file or related software except in | * |compliance with the License. You may obtain a copy of the License | * |at http://www.scitechsoft.com/nucleus-license.txt | * | | * |Software distributed under the License is distributed on an | * |"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | * |implied. See the License for the specific language governing | * |rights and limitations under the License. | * | | * |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW| * ====================================================================== * * Language: ANSI C * Environment: Any 32-bit protected mode environment * * Description: C module for the Graphics Accelerator Driver API. Uses * the SciTech PM library for interfacing with DOS * extender specific functions. * ****************************************************************************/ #include "nucleus/graphics.h" #if defined(__WIN32_VXD__) || defined(__NT_DRIVER__) #include "sdd/sddhelp.h" #else #include #include #endif /*---------------------------- Global Variables ---------------------------*/ #ifndef TEST_HARNESS GA_exports _VARAPI __GA_exports; static int loaded = false; static PE_MODULE *hModBPD = NULL; static N_imports _N_imports = { sizeof(N_imports), _OS_delay, }; static GA_imports _GA_imports = { sizeof(GA_imports), GA_getSharedInfo, GA_TimerInit, GA_TimerRead, GA_TimerDifference, }; #endif /*----------------------------- Implementation ----------------------------*/ #define DLL_NAME "graphics.bpd" /**************************************************************************** REMARKS: This function is no longer used but we must implement it and return NULL for compatibility with older binary drivers. ****************************************************************************/ GA_sharedInfo * NAPI GA_getSharedInfo( int device) { return NULL; } #ifndef TEST_HARNESS /**************************************************************************** REMARKS: Fatal error handler for non-exported GA_exports. ****************************************************************************/ static void _GA_fatalErrorHandler(void) { PM_fatalError("Unsupported Nucleus export function called! Please upgrade your copy of Nucleus!\n"); } /**************************************************************************** PARAMETERS: shared - True to load the driver into shared memory. REMARKS: Loads the Nucleus binary portable DLL into memory and initilises it. ****************************************************************************/ static ibool LoadDriver( ibool shared) { GA_initLibrary_t GA_initLibrary; GA_exports *gaExp; char filename[PM_MAX_PATH]; char bpdpath[PM_MAX_PATH]; int i,max; ulong *p; /* Check if we have already loaded the driver */ if (loaded) return true; PM_init(); /* First try to see if we can find the system wide shared exports * if they are available. Under OS/2 this connects to our global * shared Nucleus loader in SDDPMI.DLL. */ __GA_exports.dwSize = sizeof(__GA_exports); if (GA_getSharedExports(&__GA_exports,shared)) return loaded = true; /* Open the BPD file */ if (!PM_findBPD(DLL_NAME,bpdpath)) return false; strcpy(filename,bpdpath); strcat(filename,DLL_NAME); if ((hModBPD = PE_loadLibrary(filename,shared)) == NULL) return false; if ((GA_initLibrary = (GA_initLibrary_t)PE_getProcAddress(hModBPD,"_GA_initLibrary")) == NULL) return false; bpdpath[strlen(bpdpath)-1] = 0; if (strcmp(bpdpath,PM_getNucleusPath()) == 0) strcpy(bpdpath,PM_getNucleusConfigPath()); else { PM_backslash(bpdpath); strcat(bpdpath,"config"); } if ((gaExp = GA_initLibrary(shared,bpdpath,filename,GA_getSystemPMImports(),&_N_imports,&_GA_imports)) == NULL) PM_fatalError("GA_initLibrary failed!\n"); /* Initialize all default imports to point to fatal error handler * for upwards compatibility, and copy the exported functions. */ max = sizeof(__GA_exports)/sizeof(GA_initLibrary_t); for (i = 0,p = (ulong*)&__GA_exports; i < max; i++) *p++ = (ulong)_GA_fatalErrorHandler; memcpy(&__GA_exports,gaExp,MIN(sizeof(__GA_exports),gaExp->dwSize)); loaded = true; return true; } /* The following are stub entry points that the application calls to * initialise the Nucleus loader library, and we use this to load our * driver DLL from disk and initialise the library using it. */ /* {secret} */ int NAPI GA_status(void) { if (!loaded) return nDriverNotFound; return __GA_exports.GA_status(); } /* {secret} */ const char * NAPI GA_errorMsg( N_int32 status) { if (!loaded) return "Unable to load Nucleus device driver!"; return __GA_exports.GA_errorMsg(status); } /* {secret} */ int NAPI GA_getDaysLeft(N_int32 shared) { if (!LoadDriver(shared)) return -1; return __GA_exports.GA_getDaysLeft(shared); } /* {secret} */ int NAPI GA_registerLicense(uchar *license,N_int32 shared) { if (!LoadDriver(shared)) return 0; return __GA_exports.GA_registerLicense(license,shared); } /* {secret} */ ibool NAPI GA_loadInGUI(N_int32 shared) { if (!LoadDriver(shared)) return false; return __GA_exports.GA_loadInGUI(shared); } /* {secret} */ int NAPI GA_enumerateDevices(N_int32 shared) { if (!LoadDriver(shared)) return 0; return __GA_exports.GA_enumerateDevices(shared); } /* {secret} */ GA_devCtx * NAPI GA_loadDriver(N_int32 deviceIndex,N_int32 shared) { if (!LoadDriver(shared)) return NULL; return __GA_exports.GA_loadDriver(deviceIndex,shared); } /* {secret} */ void NAPI GA_getGlobalOptions( GA_globalOptions *options, ibool shared) { if (LoadDriver(shared)) __GA_exports.GA_getGlobalOptions(options,shared); } /* {secret} */ PE_MODULE * NAPI GA_loadLibrary( const char *szBPDName, ulong *size, ibool shared) { if (!LoadDriver(shared)) return NULL; return __GA_exports.GA_loadLibrary(szBPDName,size,shared); } /* {secret} */ GA_devCtx * NAPI GA_getCurrentDriver( N_int32 deviceIndex) { /* Bail for older drivers that didn't export this function! */ if (!__GA_exports.GA_getCurrentDriver) return NULL; return __GA_exports.GA_getCurrentDriver(deviceIndex); } /* {secret} */ REF2D_driver * NAPI GA_getCurrentRef2d( N_int32 deviceIndex) { /* Bail for older drivers that didn't export this function! */ if (!__GA_exports.GA_getCurrentRef2d) return NULL; return __GA_exports.GA_getCurrentRef2d(deviceIndex); } /* {secret} */ int NAPI GA_isOEMVersion(ibool shared) { if (!LoadDriver(shared)) return 0; return __GA_exports.GA_isOEMVersion(shared); } /* {secret} */ N_uint32 * NAPI GA_getLicensedDevices(ibool shared) { if (!LoadDriver(shared)) return 0; return __GA_exports.GA_getLicensedDevices(shared); } #endif