blob: f2eacc3d24f537fcbc25da0c3d2d6bd434e7e24c [file] [log] [blame]
/****************************************************************************
*
* 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 <stdio.h>
#include <stdlib.h>
#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