TRX/lib/ati3dcif/DllMain.cpp

293 lines
7.5 KiB
C++
Raw Normal View History

2021-11-12 20:03:04 +01:00
#include "Error.hpp"
#include "Renderer.hpp"
#include "Utils.hpp"
2021-11-14 23:44:55 +01:00
#include <ati3dcif/ATI3DCIF.h>
2021-11-12 20:03:04 +01:00
#include <glrage/GLRage.hpp>
#include <glrage_util/ErrorUtils.hpp>
#include <glrage_util/Logger.hpp>
#include <memory>
2021-11-14 23:59:19 +01:00
#include <stdexcept>
2021-11-12 20:03:04 +01:00
namespace glrage {
namespace cif {
static Context& context = GLRage::getContext();
2021-11-14 23:44:57 +01:00
static std::unique_ptr<Renderer> renderer = NULL;
2021-11-12 20:03:04 +01:00
static bool contextCreated = false;
C3D_EC
HandleException()
{
try {
throw;
} catch (const Error& ex) {
#ifdef _DEBUG
ErrorUtils::warning(ex);
#endif
2021-11-14 23:59:19 +01:00
LOG_INFO("CIF error: %s (0x%x %s)",
ex.what(),
ex.getErrorCode(),
2021-11-12 20:03:04 +01:00
ex.getErrorName());
return ex.getErrorCode();
} catch (const std::runtime_error& ex) {
ErrorUtils::warning(ex);
return C3D_EC_GENFAIL;
} catch (const std::logic_error& ex) {
ErrorUtils::warning(ex);
return C3D_EC_GENFAIL;
}
}
2021-11-14 23:59:19 +01:00
extern "C"
2021-11-14 23:42:18 +01:00
{
2021-11-14 23:59:19 +01:00
C3D_EC WINAPI ATI3DCIF_Term(void)
{
LOG_TRACE("");
try {
if (renderer) {
renderer.release();
}
} catch (...) {
return HandleException();
2021-11-14 23:42:18 +01:00
}
2021-11-14 23:59:19 +01:00
// SDK PDF says "TRUE if successful, otherwise FALSE", but the
// function uses C3D_EC as return value.
// In other words: TRUE = C3D_EC_GENFAIL and FALSE = C3D_EC_OK? WTF...
// Anyway, most apps don't seem to care about the return value
// of this function, so stick with C3D_EC_OK for now.
return C3D_EC_OK;
2021-11-14 23:42:18 +01:00
}
2021-11-14 23:59:19 +01:00
C3D_EC WINAPI ATI3DCIF_Init(void)
{
LOG_TRACE("");
2021-11-14 23:42:18 +01:00
2021-11-14 23:59:19 +01:00
context.init();
context.attach();
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
ErrorUtils::setHWnd(context.getHWnd());
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
// do some cleanup in case the app forgets to call ATI3DCIF_Term
if (renderer) {
LOG_INFO("Previous instance was not terminated by ATI3DCIF_Term!");
ATI3DCIF_Term();
}
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
try {
renderer = std::make_unique<Renderer>();
} catch (...) {
return HandleException();
}
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
return C3D_EC_OK;
2021-11-12 20:03:04 +01:00
}
2021-11-14 23:59:19 +01:00
C3D_EC WINAPI ATI3DCIF_TextureReg(C3D_PTMAP ptmapToReg, C3D_PHTX phtmap)
{
LOG_TRACE("0x%p, 0x%p", *ptmapToReg, *phtmap);
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
try {
renderer->textureReg(ptmapToReg, phtmap);
} catch (...) {
return HandleException();
}
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
return C3D_EC_OK;
2021-11-12 20:03:04 +01:00
}
2021-11-14 23:59:19 +01:00
C3D_EC WINAPI ATI3DCIF_TextureUnreg(C3D_HTX htxToUnreg)
{
LOG_TRACE("0x%p", htxToUnreg);
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
try {
renderer->textureUnreg(htxToUnreg);
} catch (...) {
return HandleException();
}
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
return C3D_EC_OK;
2021-11-12 20:03:04 +01:00
}
2021-11-14 23:59:19 +01:00
C3D_EC WINAPI ATI3DCIF_TexturePaletteCreate(C3D_ECI_TMAP_TYPE epalette,
void* pPalette,
C3D_PHTXPAL phtpalCreated)
{
LOG_TRACE("%s, 0x%p, 0x%p",
cif::C3D_ECI_TMAP_TYPE_NAMES[epalette],
pPalette,
phtpalCreated);
try {
renderer->texturePaletteCreate(epalette, pPalette, phtpalCreated);
} catch (...) {
return HandleException();
}
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
return C3D_EC_OK;
2021-11-12 20:03:04 +01:00
}
2021-11-14 23:59:19 +01:00
C3D_EC WINAPI ATI3DCIF_TexturePaletteDestroy(C3D_HTXPAL htxpalToDestroy)
{
LOG_TRACE("0x%p", htxpalToDestroy);
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
try {
renderer->texturePaletteDestroy(htxpalToDestroy);
} catch (...) {
return HandleException();
}
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
return C3D_EC_OK;
2021-11-12 20:03:04 +01:00
}
2021-11-14 23:59:19 +01:00
C3D_HRC WINAPI ATI3DCIF_ContextCreate(void)
{
LOG_TRACE("");
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
context.attach();
// can't create more than one context
if (contextCreated) {
return nullptr;
}
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
contextCreated = true;
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
// According to ATI3DCIF.H, "only one context may be exist at a time",
// so always returning 1 should be fine
return (C3D_HRC)1;
2021-11-12 20:03:04 +01:00
}
2021-11-14 23:59:19 +01:00
C3D_EC WINAPI ATI3DCIF_ContextDestroy(C3D_HRC hRC)
{
LOG_TRACE("0x%p", hRC);
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
// can't destroy a context that wasn't created
if (!contextCreated) {
return C3D_EC_BADPARAM;
}
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
contextCreated = false;
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
return C3D_EC_OK;
2021-11-12 20:03:04 +01:00
}
2021-11-14 23:59:19 +01:00
C3D_EC WINAPI ATI3DCIF_ContextSetState(C3D_HRC hRC,
C3D_ERSID eRStateID,
C3D_PRSDATA pRStateData)
{
2021-11-12 20:03:04 +01:00
#ifdef LOG_TRACE_ENABLED
2021-11-14 23:59:19 +01:00
std::string stateDataStr =
cif::Utils::dumpRenderStateData(eRStateID, pRStateData);
LOG_TRACE("0x%p, %s, %s",
hRC,
cif::C3D_ERSID_NAMES[eRStateID],
stateDataStr.c_str());
2021-11-12 20:03:04 +01:00
#endif
2021-11-14 23:59:19 +01:00
try {
renderer->setState(eRStateID, pRStateData);
} catch (...) {
return HandleException();
}
return C3D_EC_OK;
2021-11-12 20:03:04 +01:00
}
2021-11-14 23:59:19 +01:00
C3D_EC WINAPI ATI3DCIF_RenderBegin(C3D_HRC hRC)
{
LOG_TRACE("0x%p", hRC);
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
try {
renderer->renderBegin(hRC);
} catch (...) {
return HandleException();
}
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
return C3D_EC_OK;
2021-11-12 20:03:04 +01:00
}
2021-11-14 23:59:19 +01:00
C3D_EC WINAPI ATI3DCIF_RenderEnd(void)
{
LOG_TRACE("");
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
try {
renderer->renderEnd();
} catch (...) {
return HandleException();
}
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
return C3D_EC_OK;
2021-11-12 20:03:04 +01:00
}
2021-11-14 23:59:19 +01:00
C3D_EC WINAPI ATI3DCIF_RenderPrimStrip(C3D_VSTRIP vStrip,
C3D_UINT32 u32NumVert)
{
LOG_TRACE("0x%p, %d", vStrip, u32NumVert);
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
try {
renderer->renderPrimStrip(vStrip, u32NumVert);
} catch (...) {
return HandleException();
}
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
return C3D_EC_OK;
2021-11-12 20:03:04 +01:00
}
2021-11-14 23:59:19 +01:00
C3D_EC WINAPI ATI3DCIF_RenderPrimList(C3D_VLIST vList,
C3D_UINT32 u32NumVert)
{
LOG_TRACE("0x%p, %d", vList, u32NumVert);
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
try {
renderer->renderPrimList(vList, u32NumVert);
} catch (...) {
return HandleException();
}
2021-11-12 20:03:04 +01:00
2021-11-14 23:59:19 +01:00
return C3D_EC_OK;
2021-11-12 20:03:04 +01:00
}
2021-11-14 23:59:19 +01:00
C3D_EC __declspec(dllexport) (*WINAPI ATI3DCIF_Term_lib)(
void) = ATI3DCIF_Term;
C3D_EC __declspec(dllexport) (*WINAPI ATI3DCIF_Init_lib)(
void) = ATI3DCIF_Init;
C3D_EC __declspec(dllexport) (*WINAPI ATI3DCIF_TextureReg_lib)(
C3D_PTMAP ptmapToReg,
C3D_PHTX phtmap) = ATI3DCIF_TextureReg;
C3D_EC __declspec(dllexport) (*WINAPI ATI3DCIF_TextureUnreg_lib)(
C3D_HTX htxToUnreg) = ATI3DCIF_TextureUnreg;
C3D_EC __declspec(dllexport) (*WINAPI ATI3DCIF_TexturePaletteCreate_lib)(
C3D_ECI_TMAP_TYPE epalette,
void* pPalette,
C3D_PHTXPAL phtpalCreated) = ATI3DCIF_TexturePaletteCreate;
C3D_EC __declspec(dllexport) (*WINAPI ATI3DCIF_TexturePaletteDestroy_lib)(
C3D_HTXPAL htxpalToDestroy) = ATI3DCIF_TexturePaletteDestroy;
C3D_HRC __declspec(dllexport) (*WINAPI ATI3DCIF_ContextCreate_lib)(
void) = ATI3DCIF_ContextCreate;
C3D_EC __declspec(dllexport) (*WINAPI ATI3DCIF_ContextDestroy_lib)(
C3D_HRC hRC) = ATI3DCIF_ContextDestroy;
C3D_EC __declspec(dllexport) (*WINAPI ATI3DCIF_ContextSetState_lib)(
C3D_HRC hRC,
C3D_ERSID eRStateID,
C3D_PRSDATA pRStateData) = ATI3DCIF_ContextSetState;
C3D_EC __declspec(dllexport) (*WINAPI ATI3DCIF_RenderBegin_lib)(
C3D_HRC hRC) = ATI3DCIF_RenderBegin;
C3D_EC __declspec(dllexport) (*WINAPI ATI3DCIF_RenderEnd_lib)(
void) = ATI3DCIF_RenderEnd;
C3D_EC __declspec(dllexport) (*WINAPI ATI3DCIF_RenderPrimStrip_lib)(
C3D_VSTRIP vStrip,
C3D_UINT32 u32NumVert) = ATI3DCIF_RenderPrimStrip;
C3D_EC __declspec(dllexport) (*WINAPI ATI3DCIF_RenderPrimList_lib)(
C3D_VLIST vList,
C3D_UINT32 u32NumVert) = ATI3DCIF_RenderPrimList;
2021-11-14 23:42:18 +01:00
2021-11-12 20:03:04 +01:00
} // extern "C"
} // namespace cif
2021-11-14 23:42:18 +01:00
} // namespace glrage