Use GetSystemInfo() function to retrive number of CPUs.
This commit is contained in:
parent
97a9be1c7c
commit
6fac33e04b
|
@ -20,9 +20,6 @@
|
||||||
|
|
||||||
#ifndef NO_D3D
|
#ifndef NO_D3D
|
||||||
|
|
||||||
// The number of pixel-filter threads to be created
|
|
||||||
#define NTHREADS ( nThreads )
|
|
||||||
|
|
||||||
#pragma comment( lib, "d3d9" )
|
#pragma comment( lib, "d3d9" )
|
||||||
#pragma comment( lib, "d3dx9" )
|
#pragma comment( lib, "d3dx9" )
|
||||||
#pragma comment( lib, "DxErr9" )
|
#pragma comment( lib, "DxErr9" )
|
||||||
|
@ -114,7 +111,7 @@ private:
|
||||||
bool rectangleFillsScreen;
|
bool rectangleFillsScreen;
|
||||||
PFTHREAD_DATA *pfthread_data;
|
PFTHREAD_DATA *pfthread_data;
|
||||||
HANDLE *hThreads;
|
HANDLE *hThreads;
|
||||||
int nThreads;
|
unsigned int nThreads;
|
||||||
|
|
||||||
struct VERTEX {
|
struct VERTEX {
|
||||||
FLOAT x, y, z, rhw; // screen coordinates
|
FLOAT x, y, z, rhw; // screen coordinates
|
||||||
|
@ -373,13 +370,13 @@ bool Direct3DDisplay::initialize()
|
||||||
setOption( _T("motionBlur"), theApp.d3dMotionBlur );
|
setOption( _T("motionBlur"), theApp.d3dMotionBlur );
|
||||||
|
|
||||||
// create pfthread_data
|
// create pfthread_data
|
||||||
pfthread_data = (PFTHREAD_DATA*)malloc( sizeof(PFTHREAD_DATA) * NTHREADS );
|
pfthread_data = (PFTHREAD_DATA*)malloc( sizeof(PFTHREAD_DATA) * nThreads );
|
||||||
if( !pfthread_data ) {
|
if( !pfthread_data ) {
|
||||||
failed = true;
|
failed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// create thread handles
|
// create thread handles
|
||||||
hThreads = (HANDLE*)malloc( sizeof(HANDLE) * NTHREADS );
|
hThreads = (HANDLE*)malloc( sizeof(HANDLE) * nThreads );
|
||||||
if( !hThreads ) {
|
if( !hThreads ) {
|
||||||
failed = true;
|
failed = true;
|
||||||
}
|
}
|
||||||
|
@ -449,18 +446,19 @@ void Direct3DDisplay::render()
|
||||||
u32 pitch = theApp.sizeX * ( systemColorDepth >> 3 ) + 4;
|
u32 pitch = theApp.sizeX * ( systemColorDepth >> 3 ) + 4;
|
||||||
if( theApp.filterFunction ) {
|
if( theApp.filterFunction ) {
|
||||||
u8 *start = pix + pitch;
|
u8 *start = pix + pitch;
|
||||||
int src_height_per_thread = theApp.sizeY / NTHREADS;
|
int src_height_per_thread = theApp.sizeY / nThreads;
|
||||||
int src_height_remaining = theApp.sizeY - ( ( theApp.sizeY / NTHREADS ) * NTHREADS );
|
int src_height_remaining = theApp.sizeY - ( ( theApp.sizeY / nThreads ) * nThreads );
|
||||||
u32 src_bytes_per_thread = pitch * src_height_per_thread;
|
u32 src_bytes_per_thread = pitch * src_height_per_thread;
|
||||||
|
|
||||||
int dst_height_per_thread = src_height_per_thread * theApp.filterMagnification;
|
int dst_height_per_thread = src_height_per_thread * theApp.filterMagnification;
|
||||||
u32 dst_bytes_per_thread = lr.Pitch * dst_height_per_thread;
|
u32 dst_bytes_per_thread = lr.Pitch * dst_height_per_thread;
|
||||||
|
|
||||||
|
unsigned int i = nThreads - 1;
|
||||||
|
|
||||||
// Use Multi Threading
|
// Use Multi Threading
|
||||||
assert( ( NTHREADS > 0 ) && ( NTHREADS < MAXIMUM_PROCESSORS ) );
|
do {
|
||||||
for( int i = ( NTHREADS - 1 ) ; i > -1 ; i-- ) {
|
// create last thread first because it could have more work than the others (for eg. if nThreads = 3)
|
||||||
// create last thread first because it could have more work than the others (for eg. if NTHREADS = 3)
|
// (last thread has to process the remaining lines if (height / nThreads) is not an integer)
|
||||||
// (last thread has to process the remaining lines if (height / NTHREADS) is not an integer)
|
|
||||||
|
|
||||||
// configure thread
|
// configure thread
|
||||||
pfthread_data[i].filterFunction = theApp.filterFunction;
|
pfthread_data[i].filterFunction = theApp.filterFunction;
|
||||||
|
@ -471,7 +469,7 @@ void Direct3DDisplay::render()
|
||||||
pfthread_data[i].destPitch = lr.Pitch;
|
pfthread_data[i].destPitch = lr.Pitch;
|
||||||
pfthread_data[i].width = theApp.sizeX;
|
pfthread_data[i].width = theApp.sizeX;
|
||||||
|
|
||||||
if( i == ( NTHREADS - 1 ) ) {
|
if( i == ( nThreads - 1 ) ) {
|
||||||
// last thread
|
// last thread
|
||||||
pfthread_data[i].height = src_height_per_thread + src_height_remaining;
|
pfthread_data[i].height = src_height_per_thread + src_height_remaining;
|
||||||
} else {
|
} else {
|
||||||
|
@ -488,17 +486,17 @@ void Direct3DDisplay::render()
|
||||||
0,
|
0,
|
||||||
NULL );
|
NULL );
|
||||||
assert( hThreads[i] != NULL );
|
assert( hThreads[i] != NULL );
|
||||||
}
|
} while ( i-- );
|
||||||
|
|
||||||
// Wait until every thread has finished.
|
// Wait until every thread has finished.
|
||||||
WaitForMultipleObjects(
|
WaitForMultipleObjects(
|
||||||
NTHREADS,
|
nThreads,
|
||||||
hThreads,
|
hThreads,
|
||||||
TRUE,
|
TRUE,
|
||||||
INFINITE );
|
INFINITE );
|
||||||
|
|
||||||
// Close all thread handles.
|
// Close all thread handles.
|
||||||
for( int i = 0 ; i < NTHREADS ; i++ ) {
|
for( i = 0 ; i < nThreads ; i++ ) {
|
||||||
CloseHandle( hThreads[i] );
|
CloseHandle( hThreads[i] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1479,9 +1479,6 @@ void VBA::loadSettings()
|
||||||
windowPositionY = 0;
|
windowPositionY = 0;
|
||||||
|
|
||||||
maxCpuCores = regQueryDwordValue("maxCpuCores", 0);
|
maxCpuCores = regQueryDwordValue("maxCpuCores", 0);
|
||||||
if(maxCpuCores < 0) {
|
|
||||||
maxCpuCores = 0;
|
|
||||||
}
|
|
||||||
if(maxCpuCores == 0) {
|
if(maxCpuCores == 0) {
|
||||||
maxCpuCores = detectCpuCores();
|
maxCpuCores = detectCpuCores();
|
||||||
}
|
}
|
||||||
|
@ -2589,18 +2586,13 @@ void VBA::saveSettings()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int VBA::detectCpuCores()
|
unsigned int VBA::detectCpuCores()
|
||||||
{
|
{
|
||||||
int CPUInfo[4];
|
SYSTEM_INFO info;
|
||||||
|
|
||||||
__cpuid( CPUInfo, 1 );
|
GetSystemInfo( &info );
|
||||||
|
|
||||||
int processor_count = ( CPUInfo[1] & 0x00FF0000 ) >> 16;
|
return info.dwNumberOfProcessors;
|
||||||
|
|
||||||
// some CPUs probably do not support this instruction properly
|
|
||||||
if( processor_count < 1 ) processor_count = 1;
|
|
||||||
|
|
||||||
return processor_count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void winSignal(int, int)
|
void winSignal(int, int)
|
||||||
|
|
|
@ -79,7 +79,7 @@ class VBA : public CWinApp
|
||||||
bool mode800Available;
|
bool mode800Available;
|
||||||
bool mode1024Available;
|
bool mode1024Available;
|
||||||
bool mode1280Available;
|
bool mode1280Available;
|
||||||
int maxCpuCores; // maximum number of CPU cores VBA should use, 0 means auto-detect
|
unsigned int maxCpuCores; // maximum number of CPU cores VBA should use, 0 means auto-detect
|
||||||
int windowPositionX;
|
int windowPositionX;
|
||||||
int windowPositionY;
|
int windowPositionY;
|
||||||
void (*filterFunction)(u8*,u32,u8*,u8*,u32,int,int);
|
void (*filterFunction)(u8*,u32,u8*,u8*,u32,int,int);
|
||||||
|
@ -265,7 +265,7 @@ class VBA : public CWinApp
|
||||||
void addRecentFile(CString file);
|
void addRecentFile(CString file);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int detectCpuCores();
|
unsigned int detectCpuCores();
|
||||||
};
|
};
|
||||||
|
|
||||||
extern VBA theApp;
|
extern VBA theApp;
|
||||||
|
|
Loading…
Reference in New Issue