Merge with develop

--HG--
branch : compatibility-develop
hg/compatibility-develop
kervala 9 years ago
commit 59c0cf7f00

@ -865,6 +865,12 @@ public:
* get the official name of the driver * get the official name of the driver
*/ */
virtual const char *getVideocardInformation () = 0; virtual const char *getVideocardInformation () = 0;
/**
* Get total video memory.
* get the amount of video memory of current adapter, result is in KiB, -1 if unable to determine
*/
virtual sint getTotalVideoMemory () const = 0;
// @} // @}
@ -1342,6 +1348,7 @@ public:
uint32 DeviceId; uint32 DeviceId;
uint32 SubSysId; uint32 SubSysId;
uint32 Revision; uint32 Revision;
sint32 VideoMemory; // video memory in KiB, -1 if unable to determine
}; };
// Get the number of hardware renderer available on the client platform. // Get the number of hardware renderer available on the client platform.

@ -412,6 +412,7 @@ public:
virtual uint32 getImplementationVersion () const; virtual uint32 getImplementationVersion () const;
virtual const char* getDriverInformation (); virtual const char* getDriverInformation ();
virtual const char* getVideocardInformation (); virtual const char* getVideocardInformation ();
virtual sint getTotalVideoMemory () const;
virtual uint getNbTextureStages(); virtual uint getNbTextureStages();
virtual void getWindowSize (uint32 &width, uint32 &height); virtual void getWindowSize (uint32 &width, uint32 &height);
virtual uint getWindowWidth (); virtual uint getWindowWidth ();

@ -505,6 +505,12 @@ public:
*/ */
virtual const char* getVideocardInformation () = 0; virtual const char* getVideocardInformation () = 0;
/**
* Get total video memory.
* get the amount of video memory of current adapter, result is in KiB, -1 if unable to determine
*/
virtual sint getTotalVideoMemory () const = 0;
/// Get the number of texture stage available, for multitexturing (Normal material shaders). Valid only after setDisplay(). /// Get the number of texture stage available, for multitexturing (Normal material shaders). Valid only after setDisplay().
virtual uint getNbTextureStages() = 0; virtual uint getNbTextureStages() = 0;

@ -28,8 +28,8 @@ namespace NLMISC
# define NL_WIN_CALLBACK # define NL_WIN_CALLBACK
#endif #endif
// Default to 8KB stack for tasks // Default to 1MiB stack for tasks
const unsigned int NL_TASK_STACK_SIZE = 8*1024; const uint NL_TASK_STACK_SIZE = 1024*1024;
// forward def for platform specific data // forward def for platform specific data
struct TCoTaskData; struct TCoTaskData;

@ -26,13 +26,13 @@
# define WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN
#endif #endif
#ifndef _WIN32_WINDOWS #ifndef _WIN32_WINDOWS
# define _WIN32_WINDOWS 0x0410 # define _WIN32_WINDOWS 0x0500
#endif #endif
#ifndef _WIN32_WINNT #ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0400 # define _WIN32_WINNT 0x0500
#endif #endif
#ifndef WINVER #ifndef WINVER
# define WINVER 0x0400 # define WINVER 0x0500
#endif #endif
#ifndef NOMINMAX #ifndef NOMINMAX
# define NOMINMAX # define NOMINMAX

@ -31,13 +31,13 @@
# define WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN
#endif #endif
#ifndef _WIN32_WINDOWS #ifndef _WIN32_WINDOWS
# define _WIN32_WINDOWS 0x0410 # define _WIN32_WINDOWS 0x0500
#endif #endif
#ifndef _WIN32_WINNT #ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0400 # define _WIN32_WINNT 0x0500
#endif #endif
#ifndef WINVER #ifndef WINVER
# define WINVER 0x0400 # define WINVER 0x0500
#endif #endif
#ifndef NOMINMAX #ifndef NOMINMAX
# define NOMINMAX # define NOMINMAX

@ -293,12 +293,7 @@ public:
if (!atomic_swap (&_Lock)) if (!atomic_swap (&_Lock))
break; break;
#ifdef NL_OS_WINDOWS
nlSleep (wait_time); nlSleep (wait_time);
#else
//std::cout << "Sleeping i=" << i << std::endl;
usleep( wait_time*1000 );
#endif
} }
} }
} }
@ -401,12 +396,7 @@ public:
if (!CFastMutex::atomic_swap (&_Lock)) if (!CFastMutex::atomic_swap (&_Lock))
break; break;
#ifdef NL_OS_WINDOWS
nlSleep (wait_time); nlSleep (wait_time);
#else
//std::cout << "Sleeping i=" << i << std::endl;
usleep( wait_time*1000 );
#endif
} }
} }
} }

@ -195,9 +195,11 @@ inline std::string toString(const sint64 &val) { return toString("%"NL_I64"d", v
// error fix for size_t? gcc 4.1.2 requested this type instead of size_t ... // error fix for size_t? gcc 4.1.2 requested this type instead of size_t ...
inline std::string toString(const long unsigned int &val) inline std::string toString(const long unsigned int &val)
{ {
if (sizeof(long unsigned int) == 8) #ifdef _LP64
return toString((uint64)val); return toString((uint64)val);
#else
return toString((uint32)val); return toString((uint32)val);
#endif
} }
# endif # endif
@ -210,6 +212,7 @@ inline std::string toString(const size_t &val) { return toString("%"NL_I64"u", v
inline std::string toString(const size_t &val) { return toString("%u", val); } inline std::string toString(const size_t &val) { return toString("%u", val); }
#endif #endif
#endif #endif
inline std::string toString(const float &val) { return toString("%f", val); } inline std::string toString(const float &val) { return toString("%f", val); }
inline std::string toString(const double &val) { return toString("%lf", val); } inline std::string toString(const double &val) { return toString("%lf", val); }
inline std::string toString(const bool &val) { return toString("%u", val?1:0); } inline std::string toString(const bool &val) { return toString("%u", val?1:0); }

@ -81,6 +81,7 @@ public:
/// Detect whether the current process is a windowed application. Return true if definitely yes, false if unknown /// Detect whether the current process is a windowed application. Return true if definitely yes, false if unknown
static bool detectWindowedApplication(); static bool detectWindowedApplication();
static sint getTotalVideoMemory();
}; };
} // NLMISC } // NLMISC

@ -25,13 +25,13 @@
# define WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN
#endif #endif
#ifndef _WIN32_WINDOWS #ifndef _WIN32_WINDOWS
# define _WIN32_WINDOWS 0x0410 # define _WIN32_WINDOWS 0x0500
#endif #endif
#ifndef _WIN32_WINNT #ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0400 # define _WIN32_WINNT 0x0500
#endif #endif
#ifndef WINVER #ifndef WINVER
# define WINVER 0x0400 # define WINVER 0x0500
#endif #endif
#ifndef NOMINMAX #ifndef NOMINMAX
# define NOMINMAX # define NOMINMAX

@ -32,7 +32,7 @@ namespace NL3D
{ {
// *************************************************************************** // ***************************************************************************
const uint32 IDriver::InterfaceVersion = 0x6f; // getters for anisotropic filter const uint32 IDriver::InterfaceVersion = 0x70; // total video memory
// *************************************************************************** // ***************************************************************************
IDriver::IDriver() : _SyncTexDrvInfos( "IDriver::_SyncTexDrvInfos" ) IDriver::IDriver() : _SyncTexDrvInfos( "IDriver::_SyncTexDrvInfos" )

@ -2381,6 +2381,7 @@ bool CDriverD3D::getAdapter(uint adapter, IDriver::CAdapter &desc) const
desc.Revision = identifier.Revision; desc.Revision = identifier.Revision;
desc.SubSysId = identifier.SubSysId; desc.SubSysId = identifier.SubSysId;
desc.VendorId = identifier.VendorId; desc.VendorId = identifier.VendorId;
desc.VideoMemory = _Adapter == _adapter ? getTotalVideoMemory():-1;
return true; return true;
} }
} }
@ -2874,6 +2875,17 @@ const char *CDriverD3D::getVideocardInformation ()
// *************************************************************************** // ***************************************************************************
sint CDriverD3D::getTotalVideoMemory () const
{
H_AUTO_D3D(CDriverD3D_getTotalVideoMemory);
// Can't use _DeviceInterface->GetAvailableTextureMem() because it's not reliable
// Returns 4 GiB instead of 2 with my GPU
return -1;
}
// ***************************************************************************
void CDriverD3D::getBuffer (CBitmap &bitmap) void CDriverD3D::getBuffer (CBitmap &bitmap)
{ {
H_AUTO_D3D(CDriverD3D_getBuffer); H_AUTO_D3D(CDriverD3D_getBuffer);

@ -900,6 +900,7 @@ public:
virtual uint32 getImplementationVersion () const; virtual uint32 getImplementationVersion () const;
virtual const char* getDriverInformation (); virtual const char* getDriverInformation ();
virtual const char* getVideocardInformation (); virtual const char* getVideocardInformation ();
virtual sint getTotalVideoMemory () const;
virtual CVertexBuffer::TVertexColorType getVertexColorFormat() const; virtual CVertexBuffer::TVertexColorType getVertexColorFormat() const;
// Textures // Textures

@ -1199,6 +1199,105 @@ const char *CDriverGL::getVideocardInformation ()
return name; return name;
} }
sint CDriverGL::getTotalVideoMemory() const
{
H_AUTO_OGL(CDriverGL_getTotalVideoMemory);
if (_Extensions.NVXGPUMemoryInfo)
{
GLint memoryInKiB = 0;
glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &memoryInKiB);
nlinfo("3D: GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX returned %d KiB", memoryInKiB);
return memoryInKiB;
}
if (_Extensions.ATIMeminfo)
{
GLint memoryInKiB = 0;
glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, &memoryInKiB);
nlinfo("3D: GL_TEXTURE_FREE_MEMORY_ATI returned %d KiB", memoryInKiB);
return memoryInKiB;
}
#if defined(NL_OS_WINDOWS)
if (_Extensions.WGLAMDGPUAssociation)
{
GLuint uNoOfGPUs = nwglGetGPUIDsAMD(0, 0);
GLuint *uGPUIDs = new GLuint[uNoOfGPUs];
nwglGetGPUIDsAMD(uNoOfGPUs, uGPUIDs);
GLuint memoryInMiB = 0;
nwglGetGPUInfoAMD(uGPUIDs[0], WGL_GPU_RAM_AMD, GL_UNSIGNED_INT, sizeof(GLuint), &memoryInMiB);
delete [] uGPUIDs;
nlinfo("3D: WGL_GPU_RAM_AMD returned %d MiB", memoryInMiB);
return memoryInMiB * 1024;
}
#elif defined(NL_OS_MAC)
GLint rendererID;
// get current renderer ID
CGLError error = CGLGetParameter([_ctx CGLContextObj], kCGLCPCurrentRendererID, &rendererID);
if (error == kCGLNoError)
{
GLint nrend = 0;
CGLRendererInfoObj rend;
// get renderer info for all renderers
error = CGLQueryRendererInfo(0xffffffff, &rend, &nrend);
if (error == kCGLNoError)
{
for (GLint i = 0; i < nrend; ++i)
{
GLint thisRendererID;
error = CGLDescribeRenderer(rend, i, kCGLRPRendererID, &thisRendererID);
if (error == kCGLNoError)
{
// see if this is the one we want
if (thisRendererID == rendererID)
{
GLint memoryInMiB = 0;
CGLError error = CGLDescribeRenderer(rend, i, kCGLRPVideoMemoryMegabytes, &memoryInMiB);
if (error == kCGLNoError)
{
// convert in KiB
return memoryInMiB * 1024;
}
else
{
nlwarning("3D: Unable to get video memory (%s)", CGLErrorString(error));
}
}
}
else
{
nlwarning("3D: Unable to get renderer ID (%s)", CGLErrorString(error));
}
}
CGLDestroyRendererInfo(rend);
}
else
{
nlwarning("3D: Unable to get renderers info (%s)", CGLErrorString(error));
}
}
else
{
nlerror("3D: Unable to get current renderer ID (%s)", CGLErrorString(error));
}
#endif
return -1;
}
bool CDriverGL::clipRect(NLMISC::CRect &rect) bool CDriverGL::clipRect(NLMISC::CRect &rect)
{ {
H_AUTO_OGL(CDriverGL_clipRect) H_AUTO_OGL(CDriverGL_clipRect)
@ -2546,6 +2645,7 @@ bool CDriverGL::getAdapter(uint adapter, CAdapter &desc) const
desc.Revision = 0; desc.Revision = 0;
desc.SubSysId = 0; desc.SubSysId = 0;
desc.VendorId = 0; desc.VendorId = 0;
desc.VideoMemory = getTotalVideoMemory();
return true; return true;
} }
return false; return false;

@ -520,6 +520,8 @@ public:
virtual const char* getVideocardInformation (); virtual const char* getVideocardInformation ();
virtual sint getTotalVideoMemory() const;
virtual bool isActive (); virtual bool isActive ();
virtual uint8 getBitPerPixel (); virtual uint8 getBitPerPixel ();

@ -1790,44 +1790,7 @@ void registerGlExtensions(CGlExtensions &ext)
#ifndef USE_OPENGLES #ifndef USE_OPENGLES
ext.NVXGPUMemoryInfo = setupNVXGPUMemoryInfo(glext); ext.NVXGPUMemoryInfo = setupNVXGPUMemoryInfo(glext);
if (ext.NVXGPUMemoryInfo)
{
GLint nEvictionCount = 0;
#ifdef GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX
glGetIntegerv(GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX, &nEvictionCount);
#endif
GLint nEvictionMemory = 0;
#ifdef GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX
glGetIntegerv(GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX, &nEvictionMemory);
#endif
GLint nDedicatedMemoryInKB = 0;
#ifdef GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX
glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &nDedicatedMemoryInKB);
#endif
GLint nTotalMemoryInKB = 0;
#ifdef GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX
glGetIntegerv(GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX, &nTotalMemoryInKB);
#endif
GLint nCurAvailMemoryInKB = 0;
#ifdef GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX
glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &nCurAvailMemoryInKB);
#endif
nlinfo("Memory: total: %d available: %d dedicated: %d", nTotalMemoryInKB, nCurAvailMemoryInKB, nDedicatedMemoryInKB);
}
ext.ATIMeminfo = setupATIMeminfo(glext); ext.ATIMeminfo = setupATIMeminfo(glext);
if (ext.ATIMeminfo)
{
GLint nCurAvailMemoryInKB = 0;
glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, &nCurAvailMemoryInKB);
}
#endif #endif
} }
@ -1999,18 +1962,6 @@ bool registerWGlExtensions(CGlExtensions &ext, HDC hDC)
ext.WGLAMDGPUAssociation = setupWGLAMDGPUAssociation(glext); ext.WGLAMDGPUAssociation = setupWGLAMDGPUAssociation(glext);
if (ext.WGLAMDGPUAssociation)
{
GLuint uNoOfGPUs = nwglGetGPUIDsAMD(0, 0);
GLuint *uGPUIDs = new GLuint[uNoOfGPUs];
nwglGetGPUIDsAMD(uNoOfGPUs, uGPUIDs);
GLuint uTotalMemoryInMB = 0;
nwglGetGPUInfoAMD(uGPUIDs[0], WGL_GPU_RAM_AMD, GL_UNSIGNED_INT, sizeof(GLuint), &uTotalMemoryInMB);
delete [] uGPUIDs;
}
ext.WGLNVGPUAffinity = setupWGLNVGPUAssociation(glext); ext.WGLNVGPUAffinity = setupWGLNVGPUAssociation(glext);
if (ext.WGLNVGPUAffinity) if (ext.WGLNVGPUAffinity)

@ -1534,6 +1534,12 @@ const char* CDriverUser::getVideocardInformation ()
return _Driver->getVideocardInformation (); return _Driver->getVideocardInformation ();
} }
sint CDriverUser::getTotalVideoMemory () const
{
NL3D_HAUTO_UI_DRIVER;
return _Driver->getTotalVideoMemory ();
}
uint CDriverUser::getNbTextureStages() uint CDriverUser::getNbTextureStages()
{ {
NL3D_HAUTO_UI_DRIVER; NL3D_HAUTO_UI_DRIVER;

@ -24,12 +24,6 @@
#include "nel/misc/i_xml.h" #include "nel/misc/i_xml.h"
#include "nel/misc/o_xml.h" #include "nel/misc/o_xml.h"
#ifdef NL_OS_WINDOWS
#ifndef NL_COMP_MINGW
#define NOMINMAX
#endif
#include <windows.h>
#endif // NL_OS_WINDOWS
using namespace std; using namespace std;
using namespace NLMISC; using namespace NLMISC;

@ -362,7 +362,7 @@ string bytesToHumanReadable (const std::string &bytes)
string bytesToHumanReadable (uint64 bytes) string bytesToHumanReadable (uint64 bytes)
{ {
static const char *divTable[]= { "B", "KB", "MB", "GB", "TB" }; static const char *divTable[]= { "B", "KiB", "MiB", "GiB", "TiB" };
uint div = 0; uint div = 0;
uint64 res = bytes; uint64 res = bytes;
uint64 newres = res; uint64 newres = res;

@ -715,7 +715,8 @@ public:
{ {
str = "<NoModule>"; str = "<NoModule>";
} }
str += toString("!0x%X", addr);
str += toString("!0x%p", (void*)addr);
} }
// //
@ -740,9 +741,8 @@ public:
{ {
str = "<NoModule>"; str = "<NoModule>";
} }
char tmp[32];
sprintf (tmp, "!0x%p", addr); str += toString("!0x%p", (void*)addr);
str += tmp;
//} //}
str +=" DEBUG:"+toString("0x%p", addr); str +=" DEBUG:"+toString("0x%p", addr);

@ -138,9 +138,8 @@ static string getSourceInfo (DWORD_TYPE addr)
{ {
str = "<NoModule>"; str = "<NoModule>";
} }
char tmp[32];
sprintf (tmp, "!0x%X", addr); str += toString("!0x%p", (void*)addr);
str += tmp;
} }
return str; return str;

@ -46,12 +46,12 @@
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
# define WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN
# define _WIN32_WINDOWS 0x0410 # define _WIN32_WINDOWS 0x0500
# ifndef _WIN32_WINNT # ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0400 # define _WIN32_WINNT 0x0500
# endif # endif
# ifndef NL_COMP_MINGW # ifndef NL_COMP_MINGW
# define WINVER 0x0400 # define WINVER 0x0500
# define NOMINMAX # define NOMINMAX
# endif # endif
# include <WinSock2.h> # include <WinSock2.h>

@ -18,6 +18,14 @@
#include "nel/misc/system_utils.h" #include "nel/misc/system_utils.h"
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
#define INITGUID
#include <ddraw.h>
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <dxgi.h>
#include <initguid.h>
#include <CGuid.h>
# include <ObjBase.h> # include <ObjBase.h>
# ifdef _WIN32_WINNT_WIN7 # ifdef _WIN32_WINNT_WIN7
// only supported by Windows 7 Platform SDK // only supported by Windows 7 Platform SDK
@ -365,4 +373,234 @@ bool CSystemUtils::detectWindowedApplication()
return false; return false;
} }
#ifdef NL_OS_WINDOWS
#ifndef SAFE_RELEASE
#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p) = NULL; } }
#endif
typedef HRESULT (WINAPI* LPDIRECTDRAWCREATE)(GUID FAR *lpGUID, LPDIRECTDRAW FAR *lplpDD, IUnknown FAR *pUnkOuter);
typedef HRESULT (WINAPI* LPCREATEDXGIFACTORY)(REFIID, void**);
static std::string FormatError(HRESULT hr)
{
std::string res;
LPTSTR errorText = NULL;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&errorText, 0, NULL);
if (errorText)
{
res = NLMISC::toString("%s (0x%x)", errorText, hr);
LocalFree(errorText);
errorText = NULL;
}
return res;
}
struct SAdapter
{
uint id;
std::string name;
sint memory;
GUID guid;
HMONITOR hMonitor;
bool found;
SAdapter()
{
id = 0;
memory = -1;
guid = GUID_NULL;
hMonitor = NULL;
found = false;
}
};
static std::list<SAdapter> s_dxgiAdapters;
static void EnumerateUsingDXGI(IDXGIFactory *pDXGIFactory)
{
nlassert(pDXGIFactory != NULL);
for(uint index = 0; ; ++index)
{
IDXGIAdapter *pAdapter = NULL;
HRESULT hr = pDXGIFactory->EnumAdapters(index, &pAdapter);
// DXGIERR_NOT_FOUND is expected when the end of the list is hit
if (FAILED(hr)) break;
DXGI_ADAPTER_DESC desc;
memset(&desc, 0, sizeof(DXGI_ADAPTER_DESC));
if (SUCCEEDED(pAdapter->GetDesc(&desc)))
{
SAdapter adapter;
adapter.id = index;
adapter.name = ucstring((ucchar*)desc.Description).toUtf8();
adapter.memory = desc.DedicatedVideoMemory / 1024;
adapter.found = true;
nldebug("DXGI Adapter: %u - %s - DedicatedVideoMemory: %d KiB", index, adapter.name.c_str(), adapter.memory);
s_dxgiAdapters.push_back(adapter);
}
SAFE_RELEASE(pAdapter);
}
}
BOOL WINAPI DDEnumCallbackEx(GUID FAR* lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext, HMONITOR hm)
{
SAdapter * pAdapter = (SAdapter*)lpContext;
if (pAdapter->hMonitor == hm)
{
pAdapter->name = lpDriverDescription;
pAdapter->guid = *lpGUID;
pAdapter->found = true;
}
return TRUE;
}
#endif
sint CSystemUtils::getTotalVideoMemory()
{
sint res = -1;
#ifdef NL_OS_WINDOWS
// using DXGI
HINSTANCE hDXGI = LoadLibraryA("dxgi.dll");
if (hDXGI)
{
// We prefer the use of DXGI 1.1
LPCREATEDXGIFACTORY pCreateDXGIFactory = (LPCREATEDXGIFACTORY)GetProcAddress(hDXGI, "CreateDXGIFactory1");
if (!pCreateDXGIFactory)
{
pCreateDXGIFactory = (LPCREATEDXGIFACTORY)GetProcAddress(hDXGI, "CreateDXGIFactory");
}
if (pCreateDXGIFactory)
{
IDXGIFactory *pDXGIFactory = NULL;
HRESULT hr = pCreateDXGIFactory(__uuidof(IDXGIFactory), (LPVOID*)&pDXGIFactory);
if (SUCCEEDED(hr))
{
EnumerateUsingDXGI(pDXGIFactory);
SAFE_RELEASE(pDXGIFactory);
if (!s_dxgiAdapters.empty())
{
// TODO: determine what adapter is used by NeL
res = s_dxgiAdapters.front().memory;
}
else
{
nlwarning("Unable to find an DXGI adapter");
}
}
else
{
nlwarning("Unable to create DXGI factory");
}
}
else
{
nlwarning("dxgi.dll missing entry-point");
}
FreeLibrary(hDXGI);
}
if (res == -1)
{
// using DirectDraw
HMODULE hInstDDraw = LoadLibraryA("ddraw.dll");
if (hInstDDraw)
{
SAdapter adapter;
adapter.hMonitor = MonitorFromWindow(s_window, MONITOR_DEFAULTTONULL);
LPDIRECTDRAWENUMERATEEXA pDirectDrawEnumerateEx = (LPDIRECTDRAWENUMERATEEXA)GetProcAddress(hInstDDraw, "DirectDrawEnumerateExA");
LPDIRECTDRAWCREATE pDDCreate = (LPDIRECTDRAWCREATE)GetProcAddress(hInstDDraw, "DirectDrawCreate");
if (pDirectDrawEnumerateEx && pDDCreate)
{
HRESULT hr = pDirectDrawEnumerateEx(DDEnumCallbackEx, (VOID*)&adapter, DDENUM_ATTACHEDSECONDARYDEVICES);
if (SUCCEEDED(hr) && adapter.found)
{
LPDIRECTDRAW pDDraw = NULL;
hr = pDDCreate(&adapter.guid, &pDDraw, NULL);
if (SUCCEEDED(hr))
{
LPDIRECTDRAW7 pDDraw7 = NULL;
hr = pDDraw->QueryInterface(IID_IDirectDraw7, (VOID**)&pDDraw7);
if (SUCCEEDED(hr))
{
DDSCAPS2 ddscaps;
memset(&ddscaps, 0, sizeof(DDSCAPS2));
ddscaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM;
DWORD pdwAvailableVidMem;
hr = pDDraw7->GetAvailableVidMem(&ddscaps, &pdwAvailableVidMem, NULL);
if (SUCCEEDED(hr))
{
res = (sint)pdwAvailableVidMem / 1024;
nlinfo("DirectDraw Adapter: %s - DedicatedVideoMemory: %d KiB", adapter.name.c_str(), adapter.memory);
}
else
{
nlwarning("Unable to get DirectDraw available video memory: %s", FormatError(hr).c_str());
}
SAFE_RELEASE(pDDraw7);
}
else
{
nlwarning("Unable to query IDirectDraw7 interface: %s", FormatError(hr).c_str());
}
}
else
{
nlwarning("Unable to call DirectDrawCreate: %s", FormatError(hr).c_str());
}
}
else
{
nlwarning("Unable to enumerate DirectDraw adapters (%s): %s", (adapter.found ? "found":"not found"), FormatError(hr).c_str());
}
}
else
{
nlwarning("Unable to get pointer on DirectDraw functions (DirectDrawEnumerateExA %p, DirectDrawCreate %p)", pDirectDrawEnumerateEx, pDDCreate);
}
FreeLibrary(hInstDDraw);
}
else
{
nlwarning("Unable to load ddraw.dll");
}
}
#else
// TODO: implement for other systems
#endif
return res;
}
} // NLMISC } // NLMISC

@ -17,9 +17,9 @@
#include "nel/misc/types_nl.h" #include "nel/misc/types_nl.h"
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
# define _WIN32_WINDOWS 0x0410 # define _WIN32_WINDOWS 0x0500
# ifndef NL_COMP_MINGW # ifndef NL_COMP_MINGW
# define WINVER 0x0400 # define WINVER 0x0500
# define NOMINMAX # define NOMINMAX
# endif # endif
# include <winsock2.h> # include <winsock2.h>

@ -80,18 +80,19 @@ public:
#include <QtPlugin> #include <QtPlugin>
#ifdef Q_OS_WIN32 #if defined(Q_OS_WIN32)
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
#endif #elif defined(Q_OS_MAC)
#ifdef Q_OS_MAC
Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin) Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin)
#elif defined(Q_OS_UNIX)
Q_IMPORT_PLUGIN(QXcbIntegrationPlugin)
#endif #endif
#endif #endif
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
#ifndef WIN32 #if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
// Workaround to default -style=gtk+ on recent Cinnamon versions // Workaround to default -style=gtk+ on recent Cinnamon versions
char *currentDesktop = getenv("XDG_CURRENT_DESKTOP"); char *currentDesktop = getenv("XDG_CURRENT_DESKTOP");
if (currentDesktop) if (currentDesktop)
@ -120,5 +121,4 @@ int main( int argc, char **argv )
return ret; return ret;
else else
return w.getReturnValue(); return w.getReturnValue();
} }

@ -8,6 +8,20 @@
#include <QFile> #include <QFile>
#include <QMessageBox> #include <QMessageBox>
#ifdef QT_STATICPLUGIN
#include <QtPlugin>
#if defined(Q_OS_WIN32)
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
#elif defined(Q_OS_MAC)
Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin)
#elif defined(Q_OS_UNIX)
Q_IMPORT_PLUGIN(QXcbIntegrationPlugin)
#endif
#endif
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication app(argc, argv); QApplication app(argc, argv);

@ -12,6 +12,20 @@
#define NL_WORDS_DIC_CFG "." #define NL_WORDS_DIC_CFG "."
#endif #endif
#ifdef QT_STATICPLUGIN
#include <QtPlugin>
#if defined(Q_OS_WIN32)
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
#elif defined(Q_OS_MAC)
Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin)
#elif defined(Q_OS_UNIX)
Q_IMPORT_PLUGIN(QXcbIntegrationPlugin)
#endif
#endif
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {

@ -886,6 +886,15 @@ void initMainLoop()
{ {
if(ClientCfg.HDEntityTexture) if(ClientCfg.HDEntityTexture)
{ {
// temporary code for debug
sint videoMemory = Driver->getTotalVideoMemory();
if (videoMemory < 0) videoMemory = CSystemUtils::getTotalVideoMemory();
videoMemory /= 1024; // size in MiB
nlinfo("Video Memory detected: %d MiB", videoMemory);
// setup "v2 texture" (or 512*512) // setup "v2 texture" (or 512*512)
Driver->setupAsyncTextureLod(ENTITY_TEXTURE_COARSE_LEVEL, ENTITY_TEXTURE_HIGH_LEVEL); Driver->setupAsyncTextureLod(ENTITY_TEXTURE_COARSE_LEVEL, ENTITY_TEXTURE_HIGH_LEVEL);
// Allow a big cache for them (should be on 512 Mo card only) // Allow a big cache for them (should be on 512 Mo card only)

@ -88,7 +88,7 @@ struct SBotChatAutomatonState
uint On[5]; // value to return on player click of slot 0..4 uint On[5]; // value to return on player click of slot 0..4
// ctor ----------------------------------------------------------------- // ctor -----------------------------------------------------------------
SBotChatAutomatonState(SBotChatPage *page,uint on0=~0u,uint on1=~0u,uint on2=~0u,uint on3=~0u,uint on4=~0u) SBotChatAutomatonState(SBotChatPage *page,uint on0=std::numeric_limits<uint>::max(),uint on1=std::numeric_limits<uint>::max(),uint on2=std::numeric_limits<uint>::max(),uint on3=std::numeric_limits<uint>::max(),uint on4=std::numeric_limits<uint>::max())
{ {
Page=page; Page=page;
On[0]=on0; On[0]=on0;
@ -100,8 +100,8 @@ struct SBotChatAutomatonState
// make sure the number of arguments supplied corresponds to the // make sure the number of arguments supplied corresponds to the
// number of options prresent on the user interfac page // number of options prresent on the user interfac page
nlassert(page->NumOptions>=0 && page->NumOptions<=4); nlassert(page->NumOptions>=0 && page->NumOptions<=4);
nlassert(page->NumOptions==0 || On[page->NumOptions-1]!=~0u); nlassert(page->NumOptions==0 || On[page->NumOptions-1]!=std::numeric_limits<uint>::max());
nlassert(page->NumOptions==4 || On[page->NumOptions]==~0u); nlassert(page->NumOptions==4 || On[page->NumOptions]==std::numeric_limits<uint>::max());
} }
}; };
@ -344,7 +344,7 @@ struct CBotChat
void setState(uint32 state) void setState(uint32 state)
{ {
if (state>=Automaton->Size && state!=~0u) if (state>=Automaton->Size && state!=std::numeric_limits<uint32>::max())
{ {
nlwarning("CBotChatEntry()::setState: Invalid state: %d",state); nlwarning("CBotChatEntry()::setState: Invalid state: %d",state);
return; return;
@ -356,7 +356,7 @@ struct CBotChat
// open the new page // open the new page
CurrentState=state; CurrentState=state;
if (state==~0u) if (state==std::numeric_limits<uint32>::max())
Done=true; Done=true;
else else
Done=!Automaton->States[CurrentState].Page->PageType->open(Player,Bot); Done=!Automaton->States[CurrentState].Page->PageType->open(Player,Bot);
@ -377,7 +377,7 @@ struct CBotChat
void setAutomaton(SBotChatAutomaton *automaton) void setAutomaton(SBotChatAutomaton *automaton)
{ {
Automaton=automaton; Automaton=automaton;
CurrentState=~0u; // set this to a ~0 so that setState doesn't try to clse existing page CurrentState=std::numeric_limits<uint32>::max(); // set this to a ~0 so that setState doesn't try to clse existing page
setState(0); setState(0);
} }
@ -396,7 +396,7 @@ struct CBotChat
void endChat () void endChat ()
{ {
setState(~0u); setState(std::numeric_limits<uint32>::max());
} }
CEntityId Player; CEntityId Player;
@ -672,7 +672,7 @@ struct SBotChatAutomatonState
uint On[5]; // value to return on player click of slot 0..4 uint On[5]; // value to return on player click of slot 0..4
// ctor ----------------------------------------------------------------- // ctor -----------------------------------------------------------------
SBotChatAutomatonState(SBotChatPage *page,uint on0=~0u,uint on1=~0u,uint on2=~0u,uint on3=~0u,uint on4=~0u) SBotChatAutomatonState(SBotChatPage *page,uint on0=std::numeric_limits<uint>::max(),uint on1=std::numeric_limits<uint>::max(),uint on2=std::numeric_limits<uint>::max(),uint on3=std::numeric_limits<uint>::max(),uint on4=std::numeric_limits<uint>::max())
{ {
Page=page; Page=page;
On[0]=on0; On[0]=on0;
@ -684,8 +684,8 @@ struct SBotChatAutomatonState
// make sure the number of arguments supplied corresponds to the // make sure the number of arguments supplied corresponds to the
// number of options prresent on the user interfac page // number of options prresent on the user interfac page
nlassert(page->NumOptions>=0 && page->NumOptions<=4); nlassert(page->NumOptions>=0 && page->NumOptions<=4);
nlassert(page->NumOptions==0 || On[page->NumOptions-1]!=~0u); nlassert(page->NumOptions==0 || On[page->NumOptions-1]!=std::numeric_limits<uint>::max());
nlassert(page->NumOptions==4 || On[page->NumOptions]==~0u); nlassert(page->NumOptions==4 || On[page->NumOptions]==std::numeric_limits<uint>::max());
} }
}; };
@ -928,7 +928,7 @@ struct CBotChat
void setState(uint32 state) void setState(uint32 state)
{ {
if (state>=Automaton->Size && state!=~0u) if (state>=Automaton->Size && state!=std::numeric_limits<uint32>::max())
{ {
nlwarning("CBotChatEntry()::setState: Invalid state: %d",state); nlwarning("CBotChatEntry()::setState: Invalid state: %d",state);
return; return;
@ -940,7 +940,7 @@ struct CBotChat
// open the new page // open the new page
CurrentState=state; CurrentState=state;
if (state==~0u) if (state==std::numeric_limits<uint32>::max())
Done=true; Done=true;
else else
Done=!Automaton->States[CurrentState].Page->PageType->open(Player,Bot); Done=!Automaton->States[CurrentState].Page->PageType->open(Player,Bot);
@ -961,7 +961,7 @@ struct CBotChat
void setAutomaton(SBotChatAutomaton *automaton) void setAutomaton(SBotChatAutomaton *automaton)
{ {
Automaton=automaton; Automaton=automaton;
CurrentState=~0u; // set this to a ~0 so that setState doesn't try to clse existing page CurrentState=std::numeric_limits<uint32>::max(); // set this to a std::numeric_limits<uint32>::max() so that setState doesn't try to clse existing page
setState(0); setState(0);
} }
@ -980,7 +980,7 @@ struct CBotChat
void endChat () void endChat ()
{ {
setState(~0u); setState(std::numeric_limits<uint32>::max());
} }
CEntityId Player; CEntityId Player;

@ -4880,7 +4880,7 @@ void CCharacter::updateVisualInformation( uint16 InventoryEmpty, uint16 SlotEmpt
} }
// update visual property only if srcForm is valid // update visual property only if srcForm is valid
if(srcForm) if(srcForm)
setVisualPropertyForEquipment( SlotEmpty, srcForm, 0 , 254 ); setVisualPropertyForEquipment( SlotEmpty, srcForm, 0 , 6 );
} }
} }

@ -25,13 +25,14 @@
#include <QtPlugin> #include <QtPlugin>
#ifdef Q_OS_WIN32 #if defined(Q_OS_WIN32)
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
#endif #elif defined(Q_OS_MAC)
#ifdef Q_OS_MAC
Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin) Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin)
#elif defined(Q_OS_UNIX)
Q_IMPORT_PLUGIN(QXcbIntegrationPlugin)
#endif #endif
#endif #endif
int main(sint32 argc, char **argv) int main(sint32 argc, char **argv)

@ -357,7 +357,7 @@ class Users{
//error_log(print_r($rows,true)); //error_log(print_r($rows,true));
//error_log(print_r($result,true)); //error_log(print_r($result,true));
//error_log(print_r($json,true)); //error_log(print_r($json,true));
foreach ($json as $key => $value) { if ($json) foreach ($json as $key => $value) {
//error_log(print_r($key,true)); //error_log(print_r($key,true));
//error_log(print_r($value,true)); //error_log(print_r($value,true));

Loading…
Cancel
Save