diff --git a/dgVoodooAPI/Bin/Release/dgVoodooAPI.dll b/dgVoodooAPI/Bin/Release/dgVoodooAPI.dll new file mode 100644 index 0000000..c2e93e5 Binary files /dev/null and b/dgVoodooAPI/Bin/Release/dgVoodooAPI.dll differ diff --git a/dgVoodooAPI/Bin/Spec Release/dgVoodooAPI.dll b/dgVoodooAPI/Bin/Spec Release/dgVoodooAPI.dll new file mode 100644 index 0000000..0d7d7fb Binary files /dev/null and b/dgVoodooAPI/Bin/Spec Release/dgVoodooAPI.dll differ diff --git a/dgVoodooAPI/Doc/dgVoodooAPI.chm b/dgVoodooAPI/Doc/dgVoodooAPI.chm new file mode 100644 index 0000000..50c3e28 Binary files /dev/null and b/dgVoodooAPI/Doc/dgVoodooAPI.chm differ diff --git a/dgVoodooAPI/Inc/APIDebugObj.hpp b/dgVoodooAPI/Inc/APIDebugObj.hpp new file mode 100644 index 0000000..aedda99 --- /dev/null +++ b/dgVoodooAPI/Inc/APIDebugObj.hpp @@ -0,0 +1,106 @@ +// ***************************************************************************** +// File: APIDebugObj.hpp +// +// Description: Debug object for logging and debugging +// +// Contact person: DG +// +// ***************************************************************************** + +#ifndef APIDEBUGOBJ_HPP +#define APIDEBUGOBJ_HPP + +// --- Includes ---------------------------------------------------------------- + +#include "APITypes.h" + +// --- Predeclarations --------------------------------------------------------- + +namespace dgVoodoo { + +class IAPIDataStream; + + +// --- Debug ------------------------------------------------------------------- + +struct APIDebugObj +{ + enum InfoLevel + { + DisableInfo = 0, + EnableInfo, + EnableInfoAndBreak + }; + + enum WarningLevel + { + DisableWarning = 0, + EnableWarning, + EnableWarningAndBreak + }; + + enum ErrorLevel + { + DisableError = 0, + EnableError, + EnableErrorAndBreak + }; + + InfoLevel infoLevel; + WarningLevel warningLevel; + ErrorLevel errorLevel; + const char* pPrefixString; + UInt32 maxTraceLevel; + IAPIDataStream* pOutputStream; + + InfoLevel inline GetInfoLevel () const + { + return infoLevel; + } + + + WarningLevel inline GetWarningLevel () const + { + return warningLevel; + } + + + ErrorLevel inline GetErrorLevel () const + { + return errorLevel; + } + + + UInt32 inline GetMaxTraceLevel () const + { + return maxTraceLevel; + } + + + void inline SetDebugInfo (InfoLevel _infoLevel, WarningLevel _warningLevel, ErrorLevel _errorLevel, + const char* _pPrefixString, UInt32 _maxTraceLevel, IAPIDataStream* _pOutputStream = NULL) + { + infoLevel = _infoLevel; + warningLevel = _warningLevel; + errorLevel = _errorLevel; + pPrefixString = _pPrefixString; + maxTraceLevel = _maxTraceLevel; + pOutputStream = _pOutputStream; + } + + + APIDebugObj (InfoLevel _infoLevel, WarningLevel _warningLevel, ErrorLevel _errorLevel, + const char* _pPrefixString, UInt32 _maxTraceLevel, IAPIDataStream* _pOutputStream = NULL): + infoLevel (_infoLevel), + warningLevel (_warningLevel), + errorLevel (_errorLevel), + pPrefixString (_pPrefixString), + maxTraceLevel (_maxTraceLevel), + pOutputStream (_pOutputStream) + { + } +}; + +} // namespace dgVoodoo + +#endif // !APIDEBUGOBJ_HPP \ No newline at end of file diff --git a/dgVoodooAPI/Inc/APIObject.hpp b/dgVoodooAPI/Inc/APIObject.hpp new file mode 100644 index 0000000..d33e19d --- /dev/null +++ b/dgVoodooAPI/Inc/APIObject.hpp @@ -0,0 +1,31 @@ +// ***************************************************************************** +// File: APIObject.hpp +// +// Description: Base interface for objects created by dgVoodoo +// +// Contact person: DG +// +// ***************************************************************************** + +#ifndef APIOBJECT_HPP +#define APIOBJECT_HPP + +// --- Includes ---------------------------------------------------------------- + +#include "APITypes.h" + +namespace dgVoodoo { + +// --- APIObject --------------------------------------------------------------- + +class APIObject +{ +public: + virtual ~APIObject () {} + + virtual void Release (); +}; + +} // namespace dgVoodoo + +#endif // APIOBJECT_HPP diff --git a/dgVoodooAPI/Inc/APITypes.h b/dgVoodooAPI/Inc/APITypes.h new file mode 100644 index 0000000..c86f008 --- /dev/null +++ b/dgVoodooAPI/Inc/APITypes.h @@ -0,0 +1,45 @@ +// ***************************************************************************** +// File: APITypes.hpp +// +// Description: Definitions of basic types +// +// Contact person: DG +// +// ***************************************************************************** + +#pragma once + +// --- Typedefs ---------------------------------------------------------------- + +typedef unsigned __int64 UInt64; +typedef unsigned int UInt32; +typedef int Int32; +typedef unsigned short UInt16; +typedef short Int16; +typedef unsigned char UInt8; +typedef unsigned char Byte; +typedef char Int8; + +#if defined(_WIN64) + +typedef unsigned __int64 UIntPtr; + +#else + +typedef unsigned int UIntPtr; + +#endif + +// --- Defines ----------------------------------------------------------------- + +#define NULL 0 + +#ifdef _APIDLL + +#define API_EXPORT __declspec( dllexport ) + +#else + +#define API_EXPORT + +#endif // _APIDLL \ No newline at end of file diff --git a/dgVoodooAPI/Inc/IAPIDataStream.hpp b/dgVoodooAPI/Inc/IAPIDataStream.hpp new file mode 100644 index 0000000..a0a76a1 --- /dev/null +++ b/dgVoodooAPI/Inc/IAPIDataStream.hpp @@ -0,0 +1,48 @@ +// ***************************************************************************** +// File: IAPIDataStream.hpp +// +// Description: Interface for seekable data streams +// +// Contact person: DG +// +// ***************************************************************************** + +#ifndef IAPIDATASTREAM_HPP +#define IAPIDATASTREAM_HPP + +// --- Includes----------------------------------------------------------------- + +#include "APITypes.h" + +namespace dgVoodoo { + +// --- IDataStream ------------------------------------------------------------- + +class IAPIDataStream +{ +public: + + enum Origin + { + OSet = 0, + OCurr, + OEnd + }; + + enum Status + { + StatusOk = 0, + StatusError + }; + +public: + virtual Status Seek (Int32 move, Origin origin, UInt32* newPos = NULL) const = 0; + virtual Status Read (UInt32 count, void* buffer, UInt32* readBytes = NULL) const = 0; + virtual Status Write (UInt32 count, void* buffer, UInt32* writtenBytes = NULL) const = 0; + virtual UInt32 GetSize () const = 0; +}; + + +} // namespace dgVoodoo + +#endif // !IAPIDATASTREAM_HPP \ No newline at end of file diff --git a/dgVoodooAPI/Inc/ICPLDDI.hpp b/dgVoodooAPI/Inc/ICPLDDI.hpp new file mode 100644 index 0000000..cda9cdb --- /dev/null +++ b/dgVoodooAPI/Inc/ICPLDDI.hpp @@ -0,0 +1,108 @@ +// ***************************************************************************** +// File: ICPLDDI.hpp +// +// Description: dgVoodoo CPL DDI interface for getting API/adapter/output +// information +// +// Contact person: DG +// +// ***************************************************************************** + +#ifndef ICPLDDI_HPP +#define ICPLDDI_HPP + +// --- Includes ---------------------------------------------------------------- + +#include "dgVoodooConfig.hpp" +#include "APIDebugObj.hpp" +#include + +namespace dgVoodoo { + +// --- ICPLDDI ----------------------------------------------------------------- + +class ICPLDDI +{ +public: + + enum APIType + { + AT_Unknown = 0, + AT_D3D11, + AT_D3D12 + }; + + enum FeatureLevel + { + FL_Unknown = 0, + FL_D3D10_0, + FL_D3D10_1, + FL_D3D11_0, + FL_D3D11_1, + FL_D3D12_0, + FL_D3D12_1, + }; + + + struct OutputDesc + { + WCHAR name[32]; + WCHAR desc[128]; + HMONITOR hMonitor; + }; + + + struct ModeDesc + { + UInt32 xRes; + UInt32 yRes; + UInt32 refreshRateNumerator; + UInt32 refreshRateDenominator; + UInt32 refreshRateSimple; + + ModeDesc (): + xRes (0), + yRes (0), + refreshRateNumerator (0), + refreshRateDenominator (0), + refreshRateSimple (0) + { + } + }; + +protected: + const APIDebugObj* pDebug; + +public: + + void inline SetDebugObject (const APIDebugObj* _pDebug) { pDebug = _pDebug; } + + virtual const char* GetAPIName () = 0; + virtual ConfigGeneral::RendererAPI GetAPI () = 0; + virtual APIType GetAPIType () = 0; + + virtual bool Activate () = 0; + virtual void Deactivate () = 0; + + virtual UInt32 GetNumberOfAdapters () = 0; + virtual bool GetAdapterName (UInt32 adapterIdx, WCHAR* pName) = 0; + virtual bool IsAdapterSoftware (UInt32 adapterIdx) = 0; + + virtual UInt32 GetNumberOfOutputs (UInt32 adapterIdx) = 0; + virtual bool GetOutputDesc (UInt32 adapterIdx, UInt32 outputIdx, OutputDesc* pDesc) = 0; + + virtual UInt32 GetNumberOfMSAALevels (UInt32 adapterIdx) = 0; + virtual UInt32 GetMSAALevel (UInt32 adapterIdx, UInt32 idx) = 0; + + virtual UInt32 GetNumberOfResolutions (UInt32 adapterIdx, UInt32 outputIndex, + ConfigGeneral::ScanlineOrder scanlineOrder) = 0; + virtual bool GetResolution (UInt32 adapterIdx, UInt32 outputIdx, ConfigGeneral::ScanlineOrder scanlineOrder, + UInt32 resIdx, ModeDesc* pDesc) = 0; + + virtual UInt32 GetRefreshRateSimple (UInt32 refRateNumerator, UInt32 refRateDenominator) = 0; +}; + + +} // namespace dgVoodoo + +#endif // ICPLDDI_HPP \ No newline at end of file diff --git a/dgVoodooAPI/Inc/IConfig.hpp b/dgVoodooAPI/Inc/IConfig.hpp new file mode 100644 index 0000000..55dd5b7 --- /dev/null +++ b/dgVoodooAPI/Inc/IConfig.hpp @@ -0,0 +1,47 @@ +// ***************************************************************************** +// File: IConfig.hpp +// +// Description: dgVoodoo Config functionality interface +// +// Contact person: DG +// +// ***************************************************************************** + +#ifndef ICONFIG_HPP +#define ICONFIG_HPP + +// --- Includes ---------------------------------------------------------------- + +#include "APITypes.h" +#include "dgVoodooConfig.hpp" +#include "APIDebugObj.hpp" + +namespace dgVoodoo { + +// --- IConfig ----------------------------------------------------------------- + +class IConfig +{ + +public: + virtual bool ReadConfig (Config& toConfig, const char* pFileName, const APIDebugObj* pDebug = NULL) = 0; + virtual bool ReadConfig (Config& toConfig, const wchar_t* pFileName, const APIDebugObj* pDebug = NULL) = 0; + virtual bool ReadConfig (Config& toConfig, HANDLE hFile, const APIDebugObj* pDebug = NULL) = 0; + virtual bool ReadConfig (Config& toConfig, IAPIDataStream* pFromStream, const APIDebugObj* pDebug = NULL) = 0; + + virtual bool WriteConfig (const Config& fromConfig, const char* pFileName, const char* pINITemplate = NULL, const APIDebugObj* pDebug = NULL) = 0; + virtual bool WriteConfig (const Config& fromConfig, const wchar_t* pFileName, const char* pINITemplate = NULL, const APIDebugObj* pDebug = NULL) = 0; + virtual bool WriteConfig (const Config& fromConfig, HANDLE hFile, const char* pINITemplate = NULL, const APIDebugObj* pDebug = NULL) = 0; + virtual bool WriteConfig (const Config& fromConfig, IAPIDataStream* pToStream, const char* pINITemplate = NULL, const APIDebugObj* pDebug = NULL) = 0; + + virtual bool ValidateConfig (const Config& config, const APIDebugObj* pDebug = NULL) = 0; + virtual const char* GetINITemplate () = 0; + + virtual bool IsResolutionTypeDynamic (UInt32 width, UInt32 height) = 0; +}; + + +} // namespace dgVoodoo + + +#endif // ICONFIG_HPP \ No newline at end of file diff --git a/dgVoodooAPI/Inc/IIniParser.hpp b/dgVoodooAPI/Inc/IIniParser.hpp new file mode 100644 index 0000000..757ae8f --- /dev/null +++ b/dgVoodooAPI/Inc/IIniParser.hpp @@ -0,0 +1,66 @@ +// ***************************************************************************** +// File: IIniParser.hpp +// +// Description: Ini file parser interface +// +// Contact person: DG +// +// ***************************************************************************** + +#ifndef IINIPARSER_HPP +#define IINIPARSER_HPP + +// --- Includes ---------------------------------------------------------------- + +#include "APIObject.hpp" + +namespace dgVoodoo { + +// --- Predeclarations --------------------------------------------------------- + +class IAPIDataStream; + +// --- IIniParser -------------------------------------------------------------- + +class IIniParser: public APIObject +{ +public: + enum StringType + { + CaseSensitive = 0, + LowerCase, + UpperCase + }; + +public: + virtual ~IIniParser () {} + + virtual bool Parse (const char* pFileName, StringType stringType) = 0; + virtual bool Parse (const wchar_t* pFileName, StringType stringType) = 0; + virtual bool Parse (IAPIDataStream* pStream, StringType stringType) = 0; + + virtual UInt32 GetNumberOfSections () const = 0; + virtual const char* GetSectionName (UInt32 sectionIdx) const = 0; + + virtual UInt32 GetNumberOfProperties (UInt32 sectionIdx) const = 0; + virtual const char* GetPropertyName (UInt32 sectionIdx, UInt32 propertyIdx) const = 0; + + virtual UInt32 GetNumberOfPropertyValues (UInt32 sectionIdx, UInt32 propertyIdx) const = 0; + virtual const char* GetPropertyValueAsString (UInt32 sectionIdx, UInt32 propertyIdx, UInt32 valueIdx) const = 0; + virtual bool GetPropertyValueAsInt (UInt32 sectionIdx, UInt32 propertyIdx, UInt32 valueIdx, Int32& value) const = 0; + //virtual bool GetPropertyValueAsFloat (UInt32 sectionIdx, UInt32 propertyIdx, UInt32 valueIdx, float& value) const = 0; + + virtual UInt32 GetNumberOfSubProperties (UInt32 sectionIdx, UInt32 propertyIdx) const = 0; + virtual const char* GetSubPropertyName (UInt32 sectionIdx, UInt32 propertyIdx, UInt32 subPropertyIdx) const = 0; + virtual const char* GetSubPropertyValueAsString (UInt32 sectionIdx, UInt32 propertyIdx, UInt32 subPropertyIdx) const = 0; + virtual bool GetSubPropertyValueAsInt (UInt32 sectionIdx, UInt32 propertyIdx, UInt32 subPropertyIdx, Int32& value) const = 0; + //virtual bool GetSubPropertyValueAsFloat (UInt32 sectionIdx, UInt32 propertyIdx, UInt32 subPropertyIdx, float& value) const = 0; + + // Debug version only functions + + virtual void DbgDump () = 0; +}; + +} // namespace dgVoodoo + +#endif // !IINIPARSER_HPP diff --git a/dgVoodooAPI/Inc/IMainFactory.hpp b/dgVoodooAPI/Inc/IMainFactory.hpp new file mode 100644 index 0000000..3abe15e --- /dev/null +++ b/dgVoodooAPI/Inc/IMainFactory.hpp @@ -0,0 +1,39 @@ +// ***************************************************************************** +// File: IMainFactory.hpp +// +// Description: dgVoodoo Main Factory interface +// +// Contact person: DG +// +// ***************************************************************************** + +// --- Includes ---------------------------------------------------------------- + +#include "APITypes.h" +#include "ICPLDDI.hpp" +#include "IConfig.hpp" +#include "IIniParser.hpp" + +using namespace dgVoodoo; + +// --- Factory interface ------------------------------------------------------- + +class IMainFactory +{ +public: + + virtual ICPLDDI* GetCPLDDIObject (ConfigGeneral::RendererAPI api, const APIDebugObj* pDebug = NULL) = 0; + virtual IConfig* GetIConfig () = 0; + virtual IIniParser* CreateIniParser (const APIDebugObj* pDebug = NULL) = 0; +}; + + +// --- Functions --------------------------------------------------------------- + +extern "C" { + +IMainFactory API_EXPORT * dgVoodoo_API_Init (); +void API_EXPORT dgVoodoo_API_Exit (); +UInt32 API_EXPORT dgVoodoo_API_GetVersion (); + +} \ No newline at end of file diff --git a/dgVoodooAPI/Inc/dgVoodooConfig.hpp b/dgVoodooAPI/Inc/dgVoodooConfig.hpp new file mode 100644 index 0000000..c12f528 --- /dev/null +++ b/dgVoodooAPI/Inc/dgVoodooConfig.hpp @@ -0,0 +1,565 @@ +// ***************************************************************************** +// File: dgVoodooConfig.hpp +// +// Description: dgVoodoo configuration +// +// Contact person: DG +// +// ***************************************************************************** + +#ifndef DGVOODOOCONFIG_HPP +#define DGVOODOOCONFIG_HPP + +// --- Includes ---------------------------------------------------------------- + +#include "APITypes.h" +#include "string.h" + +// --- Defines ----------------------------------------------------------------- + +#define MAX_NUM_OF_DX_EXTRA_RESOLUTIONS 16 + +// --- Predeclarations --------------------------------------------------------- + +typedef void * HANDLE; + +namespace dgVoodoo { + +class IAPIDataStream; + +// --- Config structures ------------------------------------------------------- + +#pragma pack(push) +#pragma pack(1) + +// --- General ----------------------------------------------------------------- + +struct ConfigGeneral +{ + enum RendererAPI + { + API_BestAvailable = 0, + API_Direct3D11_FL10_0, + API_Direct3D11_FL10_1, + API_Direct3D11_MS_WARP_FL10_1, + API_Direct3D11_FL11_0, + API_Direct3D12_FL11_0, + API_Direct3D12_FL12_0, + + NumOfAPITypes + }; + + + enum Adapter + { + AdapterAll = 0 + }; + + + enum ScanlineOrder + { + SO_OutputDefault = 0, + SO_Progressive, + SO_Undefined, + + NumOfScanlineOrders + }; + + + enum ScalingMode + { + SM_Unspecified = 0, + SM_Centered, + SM_Stretched, + SM_AspectRatio, + SM_AspectRatio4_3, + SM_AspectRatio4_3_CRTLike, + SM_AspectRatio4_3_C64Like, + SM_CenteredAspectRatio, + + NumOfScalingModes + }; + + + enum Resolution + { + R_Unforced = 0, + R_Max = 0xFFFFFFFF, // It can have a parameter, the aspect ratio + R_Max_ISF = 0xFFFFFFFE, + R_MaxFHD = 0xFFFFFFFD, + R_MaxFHD_ISF = 0xFFFFFFFC, + R_MaxQHD = 0xFFFFFFFB, + R_MaxQHD_ISF = 0xFFFFFFFA, + R_IntegerScaled = 0xFFFFFFF9, // It has the integer scale value as a parameter + + // Optional parameters for R_Max + + PR_Max_4_3 = 0x100, + PR_Max_16_9 = 0x101 + }; + + RendererAPI rendererAPI; + UInt32 rendererDevice; // AdapterAll or adapter ordinal + UInt32 renderingOutput; // 0 == default + UInt32 brightnessScale; + UInt32 colorScale; + UInt32 contrastScale; + ScanlineOrder scanlineOrder; + ScalingMode scalingMode; + bool windowed; + bool keepApectRatio; + bool enumerateRefreshRates; + bool captureMouse; + bool centerAppWindow; + bool inheritColorProfile; + + ConfigGeneral (): + rendererAPI (API_BestAvailable), + rendererDevice (0), + renderingOutput (0), + brightnessScale (100), + colorScale (100), + contrastScale (100), + scanlineOrder (SO_OutputDefault), + scalingMode (SM_Unspecified), + windowed (false), + keepApectRatio (true), + enumerateRefreshRates (false), + captureMouse (true), + centerAppWindow (false), + inheritColorProfile (false) + { + } +}; + + +// --- GeneralExt -------------------------------------------------------------- + +struct ConfigGeneralExt +{ + enum Environment + { + Env_Unspecified = 0, + Env_DosBox, + Env_QEmu + }; + + + enum WindowedAttributes + { + WA_DefaultAttributes = 0x0, + + WA_BorderlessFlag = 0x1, + WA_AlwaysOnTop = 0x2, + WA_FullscreenSize = 0x4, + + WA_FlagsMask = 0x7 + }; + + + enum DisplayROIPosition + { + DROI_Centered = 0xFFFFFFFF + }; + + + enum DisplayROISize + { + DROI_Rational = 0xFFFFFFFF + }; + + + enum Resampling + { + RS_PointSampled = 0, + RS_Bilinear, + RS_Bicubic, + RS_Lanczos_2, + RS_Lanczos_3 + }; + + + UInt32 desktopResWidth; + UInt32 desktopResHeight; + UInt32 desktopRefRateNumerator; + UInt32 desktopRefRateDenominator; + UInt32 desktopBitDepth; + UInt32 deframerSize; + UInt32 imageXScaleFactor; + UInt32 imageYScaleFactor; + UInt32 displayROIPosX; + UInt32 displayROIPosY; + UInt32 displayROISizeX; + UInt32 displayROISizeY; + Environment environment; + UInt32 windowedAttributes; + Resampling resampling; + bool freeMouse; + bool enableGDIHooking; + + ConfigGeneralExt (): + desktopResWidth (0), + desktopResHeight (0), + desktopRefRateNumerator (0), + desktopRefRateDenominator (0), + desktopBitDepth (0), + deframerSize (1), + imageXScaleFactor (1), + imageYScaleFactor (1), + displayROIPosX (0), + displayROIPosY (0), + displayROISizeX (0), + displayROISizeY (0), + environment (Env_Unspecified), + windowedAttributes (WA_DefaultAttributes), + resampling (RS_Bilinear), + freeMouse (false), + enableGDIHooking (false) + { + } +}; + +// --- Glide ------------------------------------------------------------------- + +struct ConfigGlide +{ + enum CardType + { + VoodooGraphics = 0, + VoodooRush = 1, + Voodoo2 = 2, + VoodooBanshee = 3, + Other = 4, + + NumOfCardTypes + }; + + enum TexFilterType + { + TF_AppDriven = 0, + TF_ForcePoint = 0x100, + TF_ForceBilinear = 0x200 + }; + + CardType cardType; + UInt32 onBoardMemSize; + UInt32 texMemSize; + Int32 numOfTMUs; + UInt32 resWidth; + UInt32 resHeight; + UInt32 msaaLevel; + UInt32 refRateNumerator; + UInt32 refRateDenominator; + TexFilterType texFilterType; + bool disableMipMapping; + bool enableGammaRamp; + bool pointCastPalette; + bool forceVSync; + bool forceEmulateLfbPCI; + bool use16BitDepthBuffer; + bool enable3DfxWaterMark; + bool enableSplashScreen; + bool enableInactiveAppState; + + ConfigGlide (): + cardType (Voodoo2), + onBoardMemSize (8*1024*1024), + texMemSize (4*1024*1024), + numOfTMUs (2), + resWidth (0), + resHeight (0), + msaaLevel (0), + refRateNumerator (0), + refRateDenominator (0), + texFilterType (TF_AppDriven), + disableMipMapping (false), + enableGammaRamp (true), + pointCastPalette (false), + forceVSync (true), + forceEmulateLfbPCI (false), + use16BitDepthBuffer (false), + enable3DfxWaterMark (true), + enableSplashScreen (false), + enableInactiveAppState (false) + { + } +}; + +// --- GlideExt ---------------------------------------------------------------- + +struct ConfigGlideExt +{ + enum DitheringEffect + { + DE_Pure32Bit = 0, + DE_Dither2x2, + DE_Dither4x4, + + NumOfDitherinEffects, + }; + + enum Dithering + { + DT_Disabled = 0, + DT_AppDriven, + DT_ForceAlways, + + NumOfDitheringBehaviors + }; + + DitheringEffect ditheringEffect; + Dithering dithering; + UInt32 ditherOrderedMatrixSizeScale; + + ConfigGlideExt (): + ditheringEffect (DE_Pure32Bit), + dithering (DT_ForceAlways), + ditherOrderedMatrixSizeScale (0) + { + } +}; + +// --- ConfigDirectX ----------------------------------------------------------- + +struct ConfigDirectX +{ + enum CardType + { + SVGA = 0, + Virtual3D, + Geforce4Ti4800, + Radeon8500, + MatroxParhelia512, + GeforceFX5700Ultra, + + NumOfCardTypes + }; + + + enum TexFilterType + { + TF_AppDriven = 0, + TF_ForcePoint = 0x100, + TF_ForceBilinear = 0x200, + TF_ForceLinearMip = 0x300, + TF_ForceTrilinear = 0x400, + TF_ForceAniso1x = 1, + TF_ForceAniso2x = 2, + TF_ForceAniso3x = 3, + TF_ForceAniso4x = 4, + TF_ForceAniso5x = 5, + TF_ForceAniso6x = 6, + TF_ForceAniso7x = 7, + TF_ForceAniso8x = 8, + TF_ForceAniso9x = 9, + TF_ForceAniso10x = 10, + TF_ForceAniso11x = 11, + TF_ForceAniso12x = 12, + TF_ForceAniso13x = 13, + TF_ForceAniso14x = 14, + TF_ForceAniso15x = 15, + TF_ForceAniso16x = 16, + + TF_AnisoMask = 0xFF + }; + + CardType cardType; + UInt64 videoMemSize; + UInt32 resWidth; + UInt32 resHeight; + UInt32 msaaLevel; + UInt32 refRateNumerator; + UInt32 refRateDenominator; + UInt32 texFilterType; + bool disabledAndPassThru; + bool appControlledScreenState; + bool disableAltEnter; + bool watermark; + bool linearBltStretch; + bool applyPhongShading; + bool forceVSync; + bool disableMipmapping; + bool fastVideoMemAccess; + + ConfigDirectX (): + cardType (Virtual3D), + videoMemSize (256*1024*1024), + resWidth (0), + resHeight (0), + msaaLevel (0), + refRateNumerator (0), + refRateDenominator (0), + texFilterType (TF_AppDriven), + disabledAndPassThru (false), + appControlledScreenState (true), + disableAltEnter (true), + watermark (true), + linearBltStretch (false), + applyPhongShading (false), + forceVSync (false), + disableMipmapping (false), + fastVideoMemAccess (false) + { + } +}; + +// --- DirectXExt -------------------------------------------------------------- + +struct ConfigDirectXExt +{ + enum AdapterIDType + { + AIDT_Default = 0, + AIDT_nVidia, + AIDT_AMD, + AIDT_Intel + }; + + + enum DitheringEffect + { + DE_Pure32Bit = 0, + DE_Ordered2x2, + DE_Ordered4x4, + + NumOfDitheringEffects, + }; + + + enum Dithering + { + DT_Disabled = 0, + DT_AppDriven, + DT_ForceOn16Bit, + DT_ForceAlways, + + NumOfDitheringBehaviors + }; + + + enum DepthBufferBitDepth + { + DBD_AppDriven = 0, + DBD_ForceMin24, + DBD_Force32, + + NumOfDepthBufferBitDepths + }; + + + enum DefEnumResolutions + { + DER_None = 0, + DER_Classics, + DER_All, + + NumOfDefEnumResolutions + }; + + + enum EnumResBitDepths + { + ERBD_8 = 0x1, + ERBD_16 = 0x2, + ERBD_32 = 0x4, + + ERBD_All = 0x7 + }; + + + struct ExtraResolution + { + UInt32 width; + UInt32 height; + UInt32 refRate; + }; + + AdapterIDType adapterIDType; + UInt32 vendorID; + UInt32 deviceID; + UInt32 subSysID; + UInt32 revisionID; + ExtraResolution extraResolutions[MAX_NUM_OF_DX_EXTRA_RESOLUTIONS]; + DitheringEffect ditheringEffect; + Dithering dithering; + UInt32 ditherOrderedMatrixSizeScale; + DepthBufferBitDepth depthBuffersBitDepth; + DefEnumResolutions defaultEnumeratedResolutions; + UInt32 enumeratedResolutionBitDepths; + UInt32 maxVSConstRegisters; + bool msD3DDeviceNames; + bool rtTexturesForceScaleAndMSAA; + bool smoothedDepthSampling; + bool deferredScreenModeSwitch; + bool primarySurfaceBatchedUpdate; + + ConfigDirectXExt () : + adapterIDType (AIDT_Default), + vendorID (0xFFFFFFFF), + deviceID (0xFFFFFFFF), + subSysID (0xFFFFFFFF), + revisionID (0xFFFFFFFF), + ditheringEffect (DE_Pure32Bit), + dithering (DT_ForceAlways), + ditherOrderedMatrixSizeScale (0), + depthBuffersBitDepth (DBD_AppDriven), + defaultEnumeratedResolutions (DER_All), + enumeratedResolutionBitDepths (ERBD_All), + maxVSConstRegisters (256), + msD3DDeviceNames (false), + rtTexturesForceScaleAndMSAA (true), + smoothedDepthSampling (true), + deferredScreenModeSwitch (false), + primarySurfaceBatchedUpdate (false) + { + memset (extraResolutions, 0, sizeof (extraResolutions)); + } +}; + +// --- Debug ------------------------------------------------------------------- + +struct ConfigDebug +{ + enum Severity + { + D_Disable, + D_Enable, + D_EnableBreak + }; + + Severity info; + Severity warning; + Severity error; + UInt32 maxTraceLevel; + bool logToFile; + + ConfigDebug (): + info (D_Enable), + warning (D_Enable), + error (D_Enable), + maxTraceLevel (0), + logToFile (false) + { + } +}; + +// --- Config ------------------------------------------------------------------ + +struct Config +{ + ConfigGeneral general; + ConfigGlide glide; + ConfigDirectX directX; + + ConfigGeneralExt generalExt; + ConfigGlideExt glideExt; + ConfigDirectXExt directXExt; + + ConfigDebug debug; +}; + +#pragma pack(pop) + +} // namespace dgVoodoo + +#endif // !DGVOODOOCONFIG_HPP \ No newline at end of file diff --git a/dgVoodooAPI/Lib/dgVoodooAPI.lib b/dgVoodooAPI/Lib/dgVoodooAPI.lib new file mode 100644 index 0000000..8910c69 Binary files /dev/null and b/dgVoodooAPI/Lib/dgVoodooAPI.lib differ diff --git a/dgVoodooAPI/SampleApp/ReadMe.txt b/dgVoodooAPI/SampleApp/ReadMe.txt new file mode 100644 index 0000000..fb4c08e --- /dev/null +++ b/dgVoodooAPI/SampleApp/ReadMe.txt @@ -0,0 +1 @@ +Copy dgVoodooAPI.dll here either from folder 'Release' or 'Spec Release' to get the sample app to work. \ No newline at end of file diff --git a/dgVoodooAPI/SampleApp/SampleApp.cpp b/dgVoodooAPI/SampleApp/SampleApp.cpp new file mode 100644 index 0000000..91fcbcd --- /dev/null +++ b/dgVoodooAPI/SampleApp/SampleApp.cpp @@ -0,0 +1,332 @@ +// SampleApp.cpp : Defines the entry point for the console application. +// + +#include "IMainFactory.hpp" +#include "IIniParser.hpp" +#include "IAPIDataStream.hpp" +#include "APIDebugObj.hpp" + +#include "stdio.h" + + +// --- Config read/write sample ------------------------------------------------ + +static void ConfigReadWrite (IMainFactory* pFactory) +{ + printf ("\n==== Config read/write test =====\n\n"); + + // --- Config test + IConfig* pConfig = pFactory->GetIConfig (); + if (pConfig != NULL) { + + // Let's use a debug object for feedback from the debug layer + dgVoodoo::APIDebugObj debug (APIDebugObj::EnableInfo, APIDebugObj::EnableWarning, APIDebugObj::EnableError, "[TestApp] ", 0); + + // Read a config file that defines only some of the properties + dgVoodoo::Config config; + if (pConfig->ReadConfig (config, "TestFiles\\TestConfig.conf", &debug)) { + + printf ("'TestConfig.conf' is successfully read.\n"); + + // Let's change scaling mode to 'Centered, keep Aspect Ratio' + config.general.scalingMode = dgVoodoo::ConfigGeneral::SM_CenteredAspectRatio; + + // Write a binary and an INI version from it into files + const char* pINITemplate = pConfig->GetINITemplate (); + if (pConfig->WriteConfig (config, "WrittenTestFiles\\ConfigBin.conf", NULL, &debug)) { + printf ("'ConfigBin.conf' is successfully written.\n"); + } + if (pConfig->WriteConfig (config, "WrittenTestFiles\\ConfigINI.conf", pINITemplate, &debug)) { + printf ("'ConfigINI.conf' is successfully written.\n"); + } + } else { + printf ("Cannot read testconfig.conf. Test failed.\n"); + } + } +} + + +// --- Config read-from-custom-stream and write-to-file sample ----------------- + +static void ConfigFromCustomINIStream (IMainFactory* pFactory) +{ + class MyINIStream: public IAPIDataStream + { + protected: + const char* pStreamData; + mutable Int32 currentPos; + mutable Status status; + + protected: + virtual Status Seek (Int32 move, Origin origin, UInt32* newPos = NULL) const override + { + switch (origin) { + case IAPIDataStream::OCurr: + currentPos += move; + break; + + case IAPIDataStream::OSet: + currentPos = move; + break; + + case IAPIDataStream::OEnd: + currentPos = strlen (pStreamData); + break; + + default: + currentPos = -1; + break; + } + + status = (currentPos >= 0 && currentPos < (Int32) strlen (pStreamData)) ? StatusOk : StatusError; + return status; + } + + + virtual Status Read (UInt32 count, void* buffer, UInt32* readBytes = NULL) const + { + if (status == IAPIDataStream::StatusOk) { + UInt32 maxReadable = strlen (pStreamData) - currentPos; + if (count > maxReadable) { + count = maxReadable; + } + memcpy (buffer, pStreamData + currentPos, count); + currentPos += count; + if (readBytes != NULL) { + *readBytes = count; + } + } + return status; + } + + + virtual Status Write (UInt32 /*count*/, void* /*buffer*/, UInt32* /*writtenBytes*/) const + { + // no need to implement + return StatusError; + } + + + virtual UInt32 GetSize () const + { + return strlen (pStreamData); + } + + public: + MyINIStream (const char* pStreamData): + currentPos (0), + status (IAPIDataStream::StatusOk), + pStreamData (pStreamData) + { + } + + }; + + IConfig* pConfig = pFactory->GetIConfig (); + if (pConfig != NULL) { + + // --- Test for a right configuration + { + const char* pStreamData = "version = 0x255\n"\ + "[general]\n"\ + "outputapi = d3d11warp\n"\ + "brightness = 150\n"\ + "[directxext]\n"\ + "extraenumeratedresolutions = \"400x300 @ 56\" 1000x800\n"\ + "ditheringeffect = ordered4x4\n"\ + "dithering = forceon16bit"; + + MyINIStream myStream (pStreamData); + + printf ("\n==== Config read from custom stream and write to file test (right configuration) =====\n\n"); + + // Let's use a debug object for feedback from the debug layer + dgVoodoo::APIDebugObj debug (APIDebugObj::EnableInfo, APIDebugObj::EnableWarning, APIDebugObj::EnableError, "[TestApp] ", 0); + + // Read the config from out custom INI-stream + dgVoodoo::Config config; + if (pConfig->ReadConfig (config, &myStream, &debug)) { + + printf ("Config is successfully read from MyStream.\n"); + + // Write full config into a file + if (pConfig->WriteConfig (config, "WrittenTestFiles\\ConfigFromStreamINI.conf", pConfig->GetINITemplate (), &debug)) { + printf ("'ConfigFromStreamINI.conf' is successfully written.\n"); + } + } else { + printf ("Couldn't read config from MyStream. Test failed.\n"); + } + } + + // --- Test for a wrong configuration + // --- Let's redirect the output of the debug layer from the default output to a custom stream - that writes output to the console window + { + class DebugLayerOutput: public IAPIDataStream + { + protected: + virtual Status Seek (Int32 move, Origin origin, UInt32* newPos = NULL) const override + { + // no need to implement + return StatusError; + } + + + virtual Status Read (UInt32 count, void* buffer, UInt32* readBytes = NULL) const + { + // no need to implement + return StatusError; + } + + + virtual Status Write (UInt32 count, void* buffer, UInt32* writtenBytes) const + { + // Ok, it's a lame solution here, serves only demonstrating purposes + char localBuffer[1024]; + memcpy (localBuffer, buffer, count); + localBuffer[count] = 0x0; + printf ("%s", localBuffer); + + return StatusOk; + } + + + virtual UInt32 GetSize () const + { + // no need to implement + return StatusError; + } + } debugLayerOutput; + + // 'unknownsection' is invalid for dgVoodoo config property set + const char* pStreamData = "version = 0x255\n"\ + "[unknownsection]\n"\ + "dithering = forceon16bit"; + + MyINIStream myStream (pStreamData); + printf ("\n==== Config read from custom stream and write to file test (bad config) =====\n\n"); + + // Let's use a debug object for feedback from the debug layer, redirected to our stream + dgVoodoo::APIDebugObj debug (APIDebugObj::EnableInfo, APIDebugObj::EnableWarning, APIDebugObj::EnableError, "[TestApp] ", 0, &debugLayerOutput); + + // Read the config from out custom INI-stream + dgVoodoo::Config config; + pConfig->ReadConfig (config, &myStream, &debug); + } + } +} + + +// --- INI property set read sample -------------------------------------------- + +static void INIPropertySetRead (IMainFactory* pFactory) +{ + printf ("\n==== INI property set test =====\n\n"); + + // Let's use a debug object for feedback from the debug layer + dgVoodoo::APIDebugObj debug (APIDebugObj::EnableInfo, APIDebugObj::EnableWarning, APIDebugObj::EnableError, "[TestApp] ", 0); + + IIniParser* pParser = pFactory->CreateIniParser (&debug); + if (pParser != NULL) { + + if (pParser->Parse ("TestFiles\\INIPropertySet.ini", IIniParser::LowerCase)) { + + printf ("INIPropertySet.ini is successfully parsed. Dumping its content:\n\n"); + + // Dump the property set to the console window + for (UInt32 i = 0; i < pParser->GetNumberOfSections (); i++) { + const char* pSectionName = pParser->GetSectionName (i); + printf (pSectionName != NULL ? "[%s]\n" : "{global}\n", pSectionName); + + for (UInt32 j = 0; j < pParser->GetNumberOfProperties (i); j++) { + const char* pPropertyName = pParser->GetPropertyName (i, j); + printf ("%s = ", pPropertyName); + + for (UInt32 k = 0; k < pParser->GetNumberOfPropertyValues (i, j); k++) { + const char* pValue = pParser->GetPropertyValueAsString (i, j, k); + printf ("\"%s\" ", pValue); + } + for (UInt32 k = 0; k < pParser->GetNumberOfSubProperties (i, j); k++) { + const char* pName = pParser->GetSubPropertyName (i, j, k); + const char* pValue = pParser->GetSubPropertyValueAsString (i, j, k); + printf ("%s:%s ", pName, pValue); + } + printf ("\n"); + } + printf ("\n"); + } + } else { + printf ("Parsing INIPropertySet.ini has failed. Test failed.\n"); + } + + pParser->Release (); + } else { + printf ("Couldn't create iniparser object. Test failed.\n"); + } +} + + +static void DumpGraphicsSystemInformation (IMainFactory* pFactory) +{ + printf ("\n==== Graphics system information test =====\n\n"); + + // Let's use a debug object for feedback from the debug layer + dgVoodoo::APIDebugObj debug (APIDebugObj::EnableInfo, APIDebugObj::EnableWarning, APIDebugObj::EnableError, "[TestApp] ", 0); + + ICPLDDI* pCPLDDI = pFactory->GetCPLDDIObject (dgVoodoo::ConfigGeneral::API_BestAvailable, &debug); + if (pCPLDDI != NULL) { + if (pCPLDDI->Activate ()) { + + printf ("\nAPI: %s", pCPLDDI->GetAPIName ()); + + UInt32 numAdapters = pCPLDDI->GetNumberOfAdapters (); + printf ("\nNumber of adapters: %d", numAdapters); + + for (UInt32 i = 0; i < numAdapters; i++) { + WCHAR adapterName[256]; + + pCPLDDI->GetAdapterName (i, adapterName); + printf ("\nAdapter %i: %ls", i, adapterName); + + UInt32 numOutputs = pCPLDDI->GetNumberOfOutputs (i); + printf ("\n Number of outputs: %d\n", numOutputs); + for (UInt32 j = 0; j < numOutputs; j++) { + UInt32 numRes = pCPLDDI->GetNumberOfResolutions (i, j, dgVoodoo::ConfigGeneral::SO_OutputDefault); + printf ("\n Number of resolutions on output %d: %d\n", j, numRes); + + for (UInt32 k = 0; k < numRes; k++) { + dgVoodoo::ICPLDDI::ModeDesc desc; + if (pCPLDDI->GetResolution (i, j, dgVoodoo::ConfigGeneral::SO_OutputDefault, k, &desc)) { + printf ("\n %dx%d, %dHz", desc.xRes, desc.yRes, desc.refreshRateSimple); + } + } + printf ("\n"); + } + } + } else { + printf ("\nActivating CPL DDI object has failed. Test failed."); + } + } else { + printf ("\nRetrieving CPL DDI object has failed. Test failed."); + } +} + + +int main() +{ + UInt32 version = dgVoodoo_API_GetVersion (); + printf ("\ndgVoodoo API version: %x.%x%x", version >> 8, (version >> 4) & 0xF, (version >> 0) & 0xF); + + IMainFactory* pFactory = dgVoodoo_API_Init (); + if (pFactory != NULL) { + + ConfigReadWrite (pFactory); + ConfigFromCustomINIStream (pFactory); + INIPropertySetRead (pFactory); + DumpGraphicsSystemInformation (pFactory); + + dgVoodoo_API_Exit (); + } + + return 0; +} + diff --git a/dgVoodooAPI/SampleApp/SampleApp.sln b/dgVoodooAPI/SampleApp/SampleApp.sln new file mode 100644 index 0000000..01e9c04 --- /dev/null +++ b/dgVoodooAPI/SampleApp/SampleApp.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SampleApp", "SampleApp.vcxproj", "{CD7EACA5-A639-4264-9F8D-5044F8489A15}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CD7EACA5-A639-4264-9F8D-5044F8489A15}.Debug|x86.ActiveCfg = Debug|Win32 + {CD7EACA5-A639-4264-9F8D-5044F8489A15}.Debug|x86.Build.0 = Debug|Win32 + {CD7EACA5-A639-4264-9F8D-5044F8489A15}.Release|x86.ActiveCfg = Release|Win32 + {CD7EACA5-A639-4264-9F8D-5044F8489A15}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/dgVoodooAPI/SampleApp/SampleApp.vcxproj b/dgVoodooAPI/SampleApp/SampleApp.vcxproj new file mode 100644 index 0000000..095c0be --- /dev/null +++ b/dgVoodooAPI/SampleApp/SampleApp.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {CD7EACA5-A639-4264-9F8D-5044F8489A15} + Win32Proj + SampleApp + 10.0.17763.0 + + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\Inc\ + + + Console + true + $(SolutionDir)\..\Lib\ + dgVoodooAPI.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + Level3 + Disabled + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\Inc\ + + + Console + true + true + true + $(SolutionDir)\..\Lib\ + dgVoodooAPI.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + Level3 + + + MaxSpeed + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dgVoodooAPI/SampleApp/TestFiles/INIPropertySet.ini b/dgVoodooAPI/SampleApp/TestFiles/INIPropertySet.ini new file mode 100644 index 0000000..6658b34 --- /dev/null +++ b/dgVoodooAPI/SampleApp/TestFiles/INIPropertySet.ini @@ -0,0 +1,10 @@ +Color1 = BLUE + +[Geometry] +Shapes1 = rectangle, triangle +Shapes2 = "rotated rectangle" circle +Shapes3 = + +[Topology] [] + +Color2 = red R:255 G:0 B:0 \ No newline at end of file diff --git a/dgVoodooAPI/SampleApp/TestFiles/TestConfig.conf b/dgVoodooAPI/SampleApp/TestFiles/TestConfig.conf new file mode 100644 index 0000000..7152da9 --- /dev/null +++ b/dgVoodooAPI/SampleApp/TestFiles/TestConfig.conf @@ -0,0 +1,13 @@ +version = 0x255 + +[General] + +ScalingMode = stretched_ar + +[Glide] + +Resolution = max + +[DirectX] + +Resolution = 2x \ No newline at end of file