1
0
mirror of https://github.com/dege-diosg/dgVoodoo2 synced 2024-07-08 20:51:02 +02:00

333 lines
9.8 KiB
C++
Raw Permalink Normal View History

// 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;
}