diff --git a/Externals/WiiUseSrc/Src/io_nix.c b/Externals/WiiUseSrc/Src/io_nix.c index da167bcdb0..7bfc996199 100644 --- a/Externals/WiiUseSrc/Src/io_nix.c +++ b/Externals/WiiUseSrc/Src/io_nix.c @@ -187,7 +187,8 @@ static int wiiuse_connect_single(struct wiimote_t* wm, char* address) { str2ba(address, &addr.l2_bdaddr); else { - bacmp(bdaddr, BDADDR_ANY); + if (bacmp(bdaddr, BDADDR_ANY) == 0) + return 0; /* use address of device discovered */ addr.l2_bdaddr = *bdaddr; diff --git a/Source/Core/AudioCommon/Src/AlsaSoundStream.cpp b/Source/Core/AudioCommon/Src/AlsaSoundStream.cpp index b72a10b83c..8d4b3ff521 100644 --- a/Source/Core/AudioCommon/Src/AlsaSoundStream.cpp +++ b/Source/Core/AudioCommon/Src/AlsaSoundStream.cpp @@ -122,7 +122,7 @@ bool AlsaSound::AlsaInit() ERROR_LOG(AUDIO, "Sample format not available: %s\n", snd_strerror(err)); return false; } - + err = snd_pcm_hw_params_set_rate_near(handle, hwparams, &sample_rate, &dir); if (err < 0) { diff --git a/Source/Core/Common/Src/Thread.cpp b/Source/Core/Common/Src/Thread.cpp index 1f04ad1ef6..af9b608c5e 100644 --- a/Source/Core/Common/Src/Thread.cpp +++ b/Source/Core/Common/Src/Thread.cpp @@ -37,11 +37,6 @@ namespace Common #ifdef _WIN32 - void InitThreading() - { - // Nothing to do in Win32 build. - } - CriticalSection::CriticalSection(int spincount) { if (spincount) @@ -306,7 +301,8 @@ namespace Common #else // !WIN32, so must be POSIX threads - pthread_key_t threadname_key; + static pthread_key_t threadname_key; + static pthread_once_t threadname_key_once = PTHREAD_ONCE_INIT; CriticalSection::CriticalSection(int spincount_unused) { @@ -411,17 +407,6 @@ namespace Common { return pthread_equal(pthread_self(), thread_id) != 0; } - - void InitThreading() { - static int thread_init_done = 0; - if (thread_init_done) - return; - - if (pthread_key_create(&threadname_key, NULL/*free*/) != 0) - perror("Unable to create thread name key: "); - - thread_init_done++; - } void SleepCurrentThread(int ms) { @@ -433,16 +418,26 @@ namespace Common usleep(1000 * 1); } + static void FreeThreadName(void* threadname) + { + free(threadname); + } + + static void ThreadnameKeyAlloc() + { + pthread_key_create(&threadname_key, FreeThreadName); + } + void SetCurrentThreadName(const TCHAR* szThreadName) { - char *name = strdup(szThreadName); - // pthread_setspecific returns 0 on success - // free the string from strdup if fails - // creates a memory leak if it actually doesn't fail - // since we don't delete it once we delete the thread - // we are using a single threadname_key anyway for all threads - if(!pthread_setspecific(threadname_key, name)) - free(name); + pthread_once(&threadname_key_once, ThreadnameKeyAlloc); + + void* threadname; + if ((threadname = pthread_getspecific(threadname_key)) != NULL) + free(threadname); + + pthread_setspecific(threadname_key, strdup(szThreadName)); + INFO_LOG(COMMON, "%s(%s)\n", __FUNCTION__, szThreadName); } diff --git a/Source/Core/Common/Src/Thread.h b/Source/Core/Common/Src/Thread.h index 7c934f86f6..b39e22c5a1 100644 --- a/Source/Core/Common/Src/Thread.h +++ b/Source/Core/Common/Src/Thread.h @@ -203,7 +203,6 @@ namespace Common #endif }; - void InitThreading(); void SleepCurrentThread(int ms); void SwitchCurrentThread(); // On Linux, this is equal to sleep 1ms diff --git a/Source/Core/Core/Src/Core.cpp b/Source/Core/Core/Src/Core.cpp index 4119c4db1e..bfd18e4d76 100644 --- a/Source/Core/Core/Src/Core.cpp +++ b/Source/Core/Core/Src/Core.cpp @@ -190,8 +190,6 @@ bool Init() CPluginManager &pManager = CPluginManager::GetInstance(); SCoreStartupParameter &_CoreParameter = SConfig::GetInstance().m_LocalCoreStartupParameter; - Common::InitThreading(); - g_CoreStartupParameter = _CoreParameter; // FIXME DEBUG_LOG(BOOT, dump_params()); Host_SetWaitCursor(true); diff --git a/Source/Core/Core/Src/PowerPC/LUT_frsqrtex.h b/Source/Core/Core/Src/PowerPC/LUT_frsqrtex.h index 98784904de..f987dba4a6 100644 --- a/Source/Core/Core/Src/PowerPC/LUT_frsqrtex.h +++ b/Source/Core/Core/Src/PowerPC/LUT_frsqrtex.h @@ -1,21 +1,21 @@ -// Copyright (C) 2003 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ -// Gekko related unions, structs, ... -// +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +// Gekko related unions, structs, ... +// #ifndef _LUT_frsqrtex_h_ #define _LUT_frsqrtex_h_ diff --git a/Source/Core/Core/Src/PowerPC/PPCCache.cpp b/Source/Core/Core/Src/PowerPC/PPCCache.cpp index b4a85dcc5f..a187d3e293 100644 --- a/Source/Core/Core/Src/PowerPC/PPCCache.cpp +++ b/Source/Core/Core/Src/PowerPC/PPCCache.cpp @@ -1,167 +1,167 @@ -// Copyright (C) 2003 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#include "PPCCache.h" -#include "../HW/Memmap.h" -#include "PowerPC.h" - -namespace PowerPC -{ - - u32 plru_mask[8] = {11,11,19,19,37,37,69,69}; - u32 plru_value[8] = {11,3,17,1,36,4,64,0}; - - InstructionCache::InstructionCache() - { - for (u32 m = 0; m < 0xff; m++) - { - u32 w = 0; - while (m & (1<<w)) w++; - way_from_valid[m] = w; - } - - for (u32 m = 0; m < 128; m++) - { - u32 b[7]; - for (int i = 0; i < 7; i++) b[i] = m & (1<<i); - u32 w; - if (b[0]) - if (b[2]) - if (b[6]) - w = 7; - else - w = 6; - else - if (b[5]) - w = 5; - else - w = 4; - else - if (b[1]) - if (b[4]) - w = 3; - else - w = 2; - else - if (b[3]) - w = 1; - else - w = 0; - way_from_plru[m] = w; - } - } - - void InstructionCache::Reset() - { - memset(valid, 0, sizeof(valid)); - memset(plru, 0, sizeof(plru)); -#ifdef FAST_ICACHE - memset(lookup_table, 0xff, sizeof(lookup_table)); - memset(lookup_table_ex, 0xff, sizeof(lookup_table_ex)); - memset(lookup_table_vmem, 0xff, sizeof(lookup_table_vmem)); -#endif - } - - void InstructionCache::Invalidate(u32 addr) - { - if (!HID0.ICE) - return; - // invalidates the whole set - u32 set = (addr >> 5) & 0x7f; -#ifdef FAST_ICACHE - for (int i = 0; i < 8; i++) - if (valid[set] & (1<<i)) - { - if (tags[set][i] & (ICACHE_VMEM_BIT >> 12)) - lookup_table_vmem[((tags[set][i] << 7) | set) & 0xfffff] = 0xff; - else if (tags[set][i] & (ICACHE_EXRAM_BIT >> 12)) - lookup_table_ex[((tags[set][i] << 7) | set) & 0x1fffff] = 0xff; - else - lookup_table[((tags[set][i] << 7) | set) & 0xfffff] = 0xff; - } -#endif - valid[set] = 0; - } - - u32 InstructionCache::ReadInstruction(u32 addr) - { - if (!HID0.ICE) // instuction cache is disabled - return Memory::ReadUnchecked_U32(addr); - u32 set = (addr >> 5) & 0x7f; - u32 tag = addr >> 12; -#ifdef FAST_ICACHE - u32 t; - if (addr & ICACHE_VMEM_BIT) - { - t = lookup_table_vmem[(addr>>5) & 0xfffff]; - } - else if (addr & ICACHE_EXRAM_BIT) - { - t = lookup_table_ex[(addr>>5) & 0x1fffff]; - } - else - { - t = lookup_table[(addr>>5) & 0xfffff]; - } -#else - u32 t = 0xff; - for (u32 i = 0; i < 8; i++) - if (tags[set][i] == tag && (valid[set] & (1<<i))) - { - t = i; - break; - } -#endif - if (t == 0xff) // load to the cache - { - if (HID0.ILOCK) // instruction cache is locked - return Memory::ReadUnchecked_U32(addr); - // select a way - if (valid[set] != 0xff) - t = way_from_valid[valid[set]]; - else - t = way_from_plru[plru[set]]; - // load - u8 *p = Memory::GetPointer(addr & ~0x1f); - memcpy(data[set][t], p, 32); -#ifdef FAST_ICACHE - if (valid[set] & (1<<t)) - { - if (tags[set][t] & (ICACHE_VMEM_BIT >> 12)) - lookup_table_vmem[((tags[set][t] << 7) | set) & 0xfffff] = 0xff; - else if (tags[set][t] & (ICACHE_EXRAM_BIT >> 12)) - lookup_table_ex[((tags[set][t] << 7) | set) & 0x1fffff] = 0xff; - else - lookup_table[((tags[set][t] << 7) | set) & 0xfffff] = 0xff; - } - if (addr & ICACHE_VMEM_BIT) - lookup_table_vmem[(addr>>5) & 0xfffff] = t; - else if (addr & ICACHE_EXRAM_BIT) - lookup_table_ex[(addr>>5) & 0x1fffff] = t; - else - lookup_table[(addr>>5) & 0xfffff] = t; -#endif - tags[set][t] = tag; - valid[set] |= 1<<t; - } - // update plru - plru[set] = (plru[set] & ~plru_mask[t]) | plru_value[t]; - u32 res = Common::swap32(data[set][t][(addr>>2)&7]); - return res; - } - +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "PPCCache.h" +#include "../HW/Memmap.h" +#include "PowerPC.h" + +namespace PowerPC +{ + + u32 plru_mask[8] = {11,11,19,19,37,37,69,69}; + u32 plru_value[8] = {11,3,17,1,36,4,64,0}; + + InstructionCache::InstructionCache() + { + for (u32 m = 0; m < 0xff; m++) + { + u32 w = 0; + while (m & (1<<w)) w++; + way_from_valid[m] = w; + } + + for (u32 m = 0; m < 128; m++) + { + u32 b[7]; + for (int i = 0; i < 7; i++) b[i] = m & (1<<i); + u32 w; + if (b[0]) + if (b[2]) + if (b[6]) + w = 7; + else + w = 6; + else + if (b[5]) + w = 5; + else + w = 4; + else + if (b[1]) + if (b[4]) + w = 3; + else + w = 2; + else + if (b[3]) + w = 1; + else + w = 0; + way_from_plru[m] = w; + } + } + + void InstructionCache::Reset() + { + memset(valid, 0, sizeof(valid)); + memset(plru, 0, sizeof(plru)); +#ifdef FAST_ICACHE + memset(lookup_table, 0xff, sizeof(lookup_table)); + memset(lookup_table_ex, 0xff, sizeof(lookup_table_ex)); + memset(lookup_table_vmem, 0xff, sizeof(lookup_table_vmem)); +#endif + } + + void InstructionCache::Invalidate(u32 addr) + { + if (!HID0.ICE) + return; + // invalidates the whole set + u32 set = (addr >> 5) & 0x7f; +#ifdef FAST_ICACHE + for (int i = 0; i < 8; i++) + if (valid[set] & (1<<i)) + { + if (tags[set][i] & (ICACHE_VMEM_BIT >> 12)) + lookup_table_vmem[((tags[set][i] << 7) | set) & 0xfffff] = 0xff; + else if (tags[set][i] & (ICACHE_EXRAM_BIT >> 12)) + lookup_table_ex[((tags[set][i] << 7) | set) & 0x1fffff] = 0xff; + else + lookup_table[((tags[set][i] << 7) | set) & 0xfffff] = 0xff; + } +#endif + valid[set] = 0; + } + + u32 InstructionCache::ReadInstruction(u32 addr) + { + if (!HID0.ICE) // instuction cache is disabled + return Memory::ReadUnchecked_U32(addr); + u32 set = (addr >> 5) & 0x7f; + u32 tag = addr >> 12; +#ifdef FAST_ICACHE + u32 t; + if (addr & ICACHE_VMEM_BIT) + { + t = lookup_table_vmem[(addr>>5) & 0xfffff]; + } + else if (addr & ICACHE_EXRAM_BIT) + { + t = lookup_table_ex[(addr>>5) & 0x1fffff]; + } + else + { + t = lookup_table[(addr>>5) & 0xfffff]; + } +#else + u32 t = 0xff; + for (u32 i = 0; i < 8; i++) + if (tags[set][i] == tag && (valid[set] & (1<<i))) + { + t = i; + break; + } +#endif + if (t == 0xff) // load to the cache + { + if (HID0.ILOCK) // instruction cache is locked + return Memory::ReadUnchecked_U32(addr); + // select a way + if (valid[set] != 0xff) + t = way_from_valid[valid[set]]; + else + t = way_from_plru[plru[set]]; + // load + u8 *p = Memory::GetPointer(addr & ~0x1f); + memcpy(data[set][t], p, 32); +#ifdef FAST_ICACHE + if (valid[set] & (1<<t)) + { + if (tags[set][t] & (ICACHE_VMEM_BIT >> 12)) + lookup_table_vmem[((tags[set][t] << 7) | set) & 0xfffff] = 0xff; + else if (tags[set][t] & (ICACHE_EXRAM_BIT >> 12)) + lookup_table_ex[((tags[set][t] << 7) | set) & 0x1fffff] = 0xff; + else + lookup_table[((tags[set][t] << 7) | set) & 0xfffff] = 0xff; + } + if (addr & ICACHE_VMEM_BIT) + lookup_table_vmem[(addr>>5) & 0xfffff] = t; + else if (addr & ICACHE_EXRAM_BIT) + lookup_table_ex[(addr>>5) & 0x1fffff] = t; + else + lookup_table[(addr>>5) & 0xfffff] = t; +#endif + tags[set][t] = tag; + valid[set] |= 1<<t; + } + // update plru + plru[set] = (plru[set] & ~plru_mask[t]) | plru_value[t]; + u32 res = Common::swap32(data[set][t][(addr>>2)&7]); + return res; + } + } diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/BPMemLoader.h b/Source/Plugins/Plugin_VideoSoftware/Src/BPMemLoader.h index 0ddc46bb80..2002835e8e 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/BPMemLoader.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/BPMemLoader.h @@ -1,28 +1,28 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#ifndef _BPMEMLOADER_H_ -#define _BPMEMLOADER_H_ - - -#include "Common.h" - -#include "../../../Core/VideoCommon/Src/BPMemory.h" - -void InitBPMemory(); - +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _BPMEMLOADER_H_ +#define _BPMEMLOADER_H_ + + +#include "Common.h" + +#include "../../../Core/VideoCommon/Src/BPMemory.h" + +void InitBPMemory(); + #endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/CPMemLoader.h b/Source/Plugins/Plugin_VideoSoftware/Src/CPMemLoader.h index 5f81a70da6..b2abd4bc85 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/CPMemLoader.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/CPMemLoader.h @@ -1,27 +1,27 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#ifndef _CPMEMLOADER_H_ -#define _CPMEMLOADER_H_ - - -#include "Common.h" - -#include "../../../Core/VideoCommon/Src/CPMemory.h" - - +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _CPMEMLOADER_H_ +#define _CPMEMLOADER_H_ + + +#include "Common.h" + +#include "../../../Core/VideoCommon/Src/CPMemory.h" + + #endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Clipper.h b/Source/Plugins/Plugin_VideoSoftware/Src/Clipper.h index ee9e1d8ebb..5e5dd4d02c 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/Clipper.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/Clipper.h @@ -1,42 +1,42 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#ifndef _CLIPPER_H_ -#define _CLIPPER_H_ - - -#include "Common.h" -#include "NativeVertexFormat.h" - - -namespace Clipper -{ - void Init(); - - void SetViewOffset(); - - void ProcessTriangle(OutputVertexData *v0, OutputVertexData *v1, OutputVertexData *v2); - - void ProcessLine(OutputVertexData *v0, OutputVertexData *v1); - - bool CullTest(OutputVertexData *v0, OutputVertexData *v1, OutputVertexData *v2, bool &backface); - - void PerspectiveDivide(OutputVertexData *vertex); -} - - +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _CLIPPER_H_ +#define _CLIPPER_H_ + + +#include "Common.h" +#include "NativeVertexFormat.h" + + +namespace Clipper +{ + void Init(); + + void SetViewOffset(); + + void ProcessTriangle(OutputVertexData *v0, OutputVertexData *v1, OutputVertexData *v2); + + void ProcessLine(OutputVertexData *v0, OutputVertexData *v1); + + bool CullTest(OutputVertexData *v0, OutputVertexData *v1, OutputVertexData *v2, bool &backface); + + void PerspectiveDivide(OutputVertexData *vertex); +} + + #endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.h b/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.h index d40a4dc3e7..02252f3868 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.h @@ -1,37 +1,37 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#ifndef _DEBUGUTIL_H -#define _DEBUGUTIL_H - -namespace DebugUtil -{ - void Init(); - - void GetTextureBGRA(u8 *dst, u32 texmap, s32 mip, int width, int height); - - void DumpActiveTextures(); - - void OnObjectBegin(); - void OnObjectEnd(); - - void OnFrameEnd(); - - void DrawObjectBuffer(s16 x, s16 y, u8 *color, int buffer, const char *name); -} - +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _DEBUGUTIL_H +#define _DEBUGUTIL_H + +namespace DebugUtil +{ + void Init(); + + void GetTextureBGRA(u8 *dst, u32 texmap, s32 mip, int width, int height); + + void DumpActiveTextures(); + + void OnObjectBegin(); + void OnObjectEnd(); + + void OnFrameEnd(); + + void DrawObjectBuffer(s16 x, s16 y, u8 *color, int buffer, const char *name); +} + #endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.h b/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.h index 1f05123d87..2053a44472 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.h @@ -1,32 +1,32 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#ifndef _EFB_COPY_H_ -#define _EFB_COPY_H_ - - -#include "Common.h" - -namespace EfbCopy -{ - // Copy the EFB to RAM as a texture format or XFB - // Clear the EFB if needed - void CopyEfb(); -} - - +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _EFB_COPY_H_ +#define _EFB_COPY_H_ + + +#include "Common.h" + +namespace EfbCopy +{ + // Copy the EFB to RAM as a texture format or XFB + // Clear the EFB if needed + void CopyEfb(); +} + + #endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SetupUnit.h b/Source/Plugins/Plugin_VideoSoftware/Src/SetupUnit.h index 9866b22047..45a575afcb 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SetupUnit.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SetupUnit.h @@ -1,50 +1,50 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - - -#ifndef _SETUPUNIT_H_ -#define _SETUPUNIT_H_ - -#include "Common.h" -#include "NativeVertexFormat.h" - -class SetupUnit -{ - u8 m_PrimType; - int m_VertexCounter; - - OutputVertexData m_Vertices[3]; - OutputVertexData *m_VertPointer[3]; - OutputVertexData *m_VertWritePointer; - - void SetupQuad(); - void SetupTriangle(); - void SetupTriStrip(); - void SetupTriFan(); - void SetupLine(); - void SetupLineStrip(); - void SetupPoint(); - -public: - void Init(u8 primitiveType); - - OutputVertexData* GetVertex() { return m_VertWritePointer; } - - void SetupVertex(); -}; - +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + +#ifndef _SETUPUNIT_H_ +#define _SETUPUNIT_H_ + +#include "Common.h" +#include "NativeVertexFormat.h" + +class SetupUnit +{ + u8 m_PrimType; + int m_VertexCounter; + + OutputVertexData m_Vertices[3]; + OutputVertexData *m_VertPointer[3]; + OutputVertexData *m_VertWritePointer; + + void SetupQuad(); + void SetupTriangle(); + void SetupTriStrip(); + void SetupTriFan(); + void SetupLine(); + void SetupLineStrip(); + void SetupPoint(); + +public: + void Init(u8 primitiveType); + + OutputVertexData* GetVertex() { return m_VertWritePointer; } + + void SetupVertex(); +}; + #endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/TextureEncoder.h b/Source/Plugins/Plugin_VideoSoftware/Src/TextureEncoder.h index fa16f1d06e..031f20adf6 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/TextureEncoder.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/TextureEncoder.h @@ -1,29 +1,29 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - - -#ifndef _OPCODEDECODER_H_ -#define _OPCODEDECODER_H_ - -#include "Common.h" - -namespace TextureEncoder -{ - void Encode(u8 *dest_ptr); -} - +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + +#ifndef _OPCODEDECODER_H_ +#define _OPCODEDECODER_H_ + +#include "Common.h" + +namespace TextureEncoder +{ + void Encode(u8 *dest_ptr); +} + #endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/TextureSampler.h b/Source/Plugins/Plugin_VideoSoftware/Src/TextureSampler.h index b456769c92..36d54c8821 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/TextureSampler.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/TextureSampler.h @@ -1,32 +1,32 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#ifndef _TEXTURESAMPLER_H_ -#define _TEXTURESAMPLER_H_ - - -#include "Common.h" - -namespace TextureSampler -{ - void Sample(s32 s, s32 t, s32 lod, bool linear, u8 texmap, u8 *sample); - - void SampleMip(s32 s, s32 t, s32 mip, bool linear, u8 texmap, u8 *sample); -} - - +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _TEXTURESAMPLER_H_ +#define _TEXTURESAMPLER_H_ + + +#include "Common.h" + +namespace TextureSampler +{ + void Sample(s32 s, s32 t, s32 lod, bool linear, u8 texmap, u8 *sample); + + void SampleMip(s32 s, s32 t, s32 mip, bool linear, u8 texmap, u8 *sample); +} + + #endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp index 3ae2e456a1..2ebc7e6c82 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.cpp @@ -1,494 +1,494 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#include "Common.h" - -#include <math.h> - -#include "TransformUnit.h" -#include "XFMemLoader.h" -#include "CPMemLoader.h" -#include "BPMemLoader.h" -#include "NativeVertexFormat.h" - -#include "../../Plugin_VideoDX9/Src/Vec3.h" - - -namespace TransformUnit -{ - -void MultiplyVec2Mat24(const Vec3 &vec, const float *mat, Vec3 &result) -{ - result.x = mat[0] * vec.x + mat[1] * vec.y + mat[2] + mat[3]; - result.y = mat[4] * vec.x + mat[5] * vec.y + mat[6] + mat[7]; -} - -void MultiplyVec2Mat34(const Vec3 &vec, const float *mat, Vec3 &result) -{ - result.x = mat[0] * vec.x + mat[1] * vec.y + mat[2] + mat[3]; - result.y = mat[4] * vec.x + mat[5] * vec.y + mat[6] + mat[7]; - result.z = mat[8] * vec.x + mat[9] * vec.y + mat[10] + mat[11]; -} - -void MultiplyVec3Mat33(const Vec3 &vec, const float *mat, Vec3 &result) -{ - result.x = mat[0] * vec.x + mat[1] * vec.y + mat[2] * vec.z; - result.y = mat[3] * vec.x + mat[4] * vec.y + mat[5] * vec.z; - result.z = mat[6] * vec.x + mat[7] * vec.y + mat[8] * vec.z; -} - -void MultiplyVec3Mat34(const Vec3 &vec, const float *mat, Vec3 &result) -{ - result.x = mat[0] * vec.x + mat[1] * vec.y + mat[2] * vec.z + mat[3]; - result.y = mat[4] * vec.x + mat[5] * vec.y + mat[6] * vec.z + mat[7]; - result.z = mat[8] * vec.x + mat[9] * vec.y + mat[10] * vec.z + mat[11]; -} - -void MultipleVec3Perspective(const Vec3 &vec, const float *proj, Vec4 &result) -{ - result.x = proj[0] * vec.x + proj[1] * vec.z; - result.y = proj[2] * vec.y + proj[3] * vec.z; - //result.z = (proj[4] * vec.z + proj[5]); - result.z = (proj[4] * vec.z + proj[5]) * (1.0f - (float)1e-7); - result.w = -vec.z; -} - -void MultipleVec3Ortho(const Vec3 &vec, const float *proj, Vec4 &result) -{ - result.x = proj[0] * vec.x + proj[1]; - result.y = proj[2] * vec.y + proj[3]; - result.z = proj[4] * vec.z + proj[5]; - result.w = 1; -} - -void TransformPosition(const InputVertexData *src, OutputVertexData *dst) -{ - const float* mat = (const float*)&xfregs.posMatrices[src->posMtx * 4]; - MultiplyVec3Mat34(src->position, mat, dst->mvPosition); - - if (xfregs.projection[6] == 0) - { - MultipleVec3Perspective(dst->mvPosition, xfregs.projection, dst->projectedPosition); - } - else - { - MultipleVec3Ortho(dst->mvPosition, xfregs.projection, dst->projectedPosition); - } -} - -void TransformNormal(const InputVertexData *src, bool nbt, OutputVertexData *dst) -{ - const float* mat = (const float*)&xfregs.normalMatrices[(src->posMtx & 31) * 3]; - - if (nbt) - { - MultiplyVec3Mat33(src->normal[0], mat, dst->normal[0]); - MultiplyVec3Mat33(src->normal[1], mat, dst->normal[1]); - MultiplyVec3Mat33(src->normal[2], mat, dst->normal[2]); - dst->normal[0].normalize(); - } - else - { - MultiplyVec3Mat33(src->normal[0], mat, dst->normal[0]); - dst->normal[0].normalize(); - } -} - -inline void TransformTexCoordRegular(const TexMtxInfo &texinfo, int coordNum, bool specialCase, const InputVertexData *srcVertex, OutputVertexData *dstVertex) -{ - const Vec3 *src; - switch (texinfo.sourcerow) - { - case XF_SRCGEOM_INROW: - src = &srcVertex->position; - break; - case XF_SRCNORMAL_INROW: - src = &srcVertex->normal[0]; - break; - case XF_SRCBINORMAL_T_INROW: - src = &srcVertex->normal[1]; - break; - case XF_SRCBINORMAL_B_INROW: - src = &srcVertex->normal[2]; - break; - default: - _assert_(texinfo.sourcerow >= XF_SRCTEX0_INROW && texinfo.sourcerow <= XF_SRCTEX7_INROW); - src = (Vec3*)srcVertex->texCoords[texinfo.sourcerow - XF_SRCTEX0_INROW]; - break; - } - - const float *mat = (const float*)&xfregs.posMatrices[srcVertex->texMtx[coordNum] * 4]; - Vec3 *dst = &dstVertex->texCoords[coordNum]; - - if (texinfo.inputform == XF_TEXINPUT_AB11) - { - MultiplyVec2Mat34(*src, mat, *dst); - } - else - { - MultiplyVec3Mat34(*src, mat, *dst); - } - - if (xfregs.dualTexTrans) - { - Vec3 tempCoord; - - // normalize - const PostMtxInfo &postInfo = xfregs.postMtxInfo[coordNum]; - const float *postMat = (const float*)&xfregs.postMatrices[postInfo.index * 4]; - - if (specialCase) - { - // no normalization - // q of input is 1 - // q of output is unknown - tempCoord.x = dst->x; - tempCoord.y = dst->y; - - dst->x = postMat[0] * tempCoord.x + postMat[1] * tempCoord.y + postMat[2] + postMat[3]; - dst->y = postMat[4] * tempCoord.x + postMat[5] * tempCoord.y + postMat[6] + postMat[7]; - dst->z = 1.0f; - } - else - { - if (postInfo.normalize) - tempCoord = dst->normalized(); - else - tempCoord = *dst; - - MultiplyVec3Mat34(tempCoord, postMat, *dst); - } - } -} - -struct LightPointer -{ - u32 reserved[3]; - u8 color[4]; - Vec3 cosatt; - Vec3 distatt; - Vec3 pos; - Vec3 dir; -}; - -inline void AddIntegerColor(const u8 *src, Vec3 &dst) -{ - dst.x += src[1]; - dst.y += src[2]; - dst.z += src[3]; -} - -inline void AddScaledIntegerColor(const u8 *src, float scale, Vec3 &dst) -{ - dst.x += src[1] * scale; - dst.y += src[2] * scale; - dst.z += src[3] * scale; -} - -inline float Clamp(float val, float a, float b) -{ - return val<a?a:val>b?b:val; -} - -inline float SafeDivide(float n, float d) -{ - return (d==0)?(n>0?1:0):n/d; -} - -void LightColor(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChannel &chan, Vec3 &lightCol) -{ - const LightPointer *light = (const LightPointer*)&xfregs.lights[0x10*lightNum]; - - if (!(chan.attnfunc & 1)) { - // atten disabled - switch (chan.diffusefunc) { - case LIGHTDIF_NONE: - AddIntegerColor(light->color, lightCol); - break; - case LIGHTDIF_SIGN: - { - Vec3 ldir = (light->pos - pos).normalized(); - float diffuse = ldir * normal; - AddScaledIntegerColor(light->color, diffuse, lightCol); - } - break; - case LIGHTDIF_CLAMP: - { - Vec3 ldir = (light->pos - pos).normalized(); - float diffuse = max(0.0f, ldir * normal); - AddScaledIntegerColor(light->color, diffuse, lightCol); - } - break; - default: _assert_(0); - } - } - else { // spec and spot - // not sure about divide by zero checks - Vec3 ldir = light->pos - pos; - float attn; - - if (chan.attnfunc == 3) { // spot - float dist2 = ldir.length2(); - float dist = sqrtf(dist2); - ldir = ldir / dist; - attn = max(0.0f, ldir * light->dir); - - float cosAtt = light->cosatt.x + (light->cosatt.y * attn) + (light->cosatt.z * attn * attn); - float distAtt = light->distatt.x + (light->distatt.y * dist) + (light->distatt.z * dist2); - attn = SafeDivide(max(0.0f, cosAtt), distAtt); - } - else if (chan.attnfunc == 1) { // specular - // donko - what is going on here? 655.36 is a guess but seems about right. - attn = (light->pos * normal) > -655.36 ? max(0.0f, (light->dir * normal)) : 0; - ldir.set(1.0f, attn, attn * attn); - - float cosAtt = max(0.0f, light->cosatt * ldir); - float distAtt = light->distatt * ldir; - attn = SafeDivide(max(0.0f, cosAtt), distAtt); - } else { +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Common.h" + +#include <math.h> + +#include "TransformUnit.h" +#include "XFMemLoader.h" +#include "CPMemLoader.h" +#include "BPMemLoader.h" +#include "NativeVertexFormat.h" + +#include "../../Plugin_VideoDX9/Src/Vec3.h" + + +namespace TransformUnit +{ + +void MultiplyVec2Mat24(const Vec3 &vec, const float *mat, Vec3 &result) +{ + result.x = mat[0] * vec.x + mat[1] * vec.y + mat[2] + mat[3]; + result.y = mat[4] * vec.x + mat[5] * vec.y + mat[6] + mat[7]; +} + +void MultiplyVec2Mat34(const Vec3 &vec, const float *mat, Vec3 &result) +{ + result.x = mat[0] * vec.x + mat[1] * vec.y + mat[2] + mat[3]; + result.y = mat[4] * vec.x + mat[5] * vec.y + mat[6] + mat[7]; + result.z = mat[8] * vec.x + mat[9] * vec.y + mat[10] + mat[11]; +} + +void MultiplyVec3Mat33(const Vec3 &vec, const float *mat, Vec3 &result) +{ + result.x = mat[0] * vec.x + mat[1] * vec.y + mat[2] * vec.z; + result.y = mat[3] * vec.x + mat[4] * vec.y + mat[5] * vec.z; + result.z = mat[6] * vec.x + mat[7] * vec.y + mat[8] * vec.z; +} + +void MultiplyVec3Mat34(const Vec3 &vec, const float *mat, Vec3 &result) +{ + result.x = mat[0] * vec.x + mat[1] * vec.y + mat[2] * vec.z + mat[3]; + result.y = mat[4] * vec.x + mat[5] * vec.y + mat[6] * vec.z + mat[7]; + result.z = mat[8] * vec.x + mat[9] * vec.y + mat[10] * vec.z + mat[11]; +} + +void MultipleVec3Perspective(const Vec3 &vec, const float *proj, Vec4 &result) +{ + result.x = proj[0] * vec.x + proj[1] * vec.z; + result.y = proj[2] * vec.y + proj[3] * vec.z; + //result.z = (proj[4] * vec.z + proj[5]); + result.z = (proj[4] * vec.z + proj[5]) * (1.0f - (float)1e-7); + result.w = -vec.z; +} + +void MultipleVec3Ortho(const Vec3 &vec, const float *proj, Vec4 &result) +{ + result.x = proj[0] * vec.x + proj[1]; + result.y = proj[2] * vec.y + proj[3]; + result.z = proj[4] * vec.z + proj[5]; + result.w = 1; +} + +void TransformPosition(const InputVertexData *src, OutputVertexData *dst) +{ + const float* mat = (const float*)&xfregs.posMatrices[src->posMtx * 4]; + MultiplyVec3Mat34(src->position, mat, dst->mvPosition); + + if (xfregs.projection[6] == 0) + { + MultipleVec3Perspective(dst->mvPosition, xfregs.projection, dst->projectedPosition); + } + else + { + MultipleVec3Ortho(dst->mvPosition, xfregs.projection, dst->projectedPosition); + } +} + +void TransformNormal(const InputVertexData *src, bool nbt, OutputVertexData *dst) +{ + const float* mat = (const float*)&xfregs.normalMatrices[(src->posMtx & 31) * 3]; + + if (nbt) + { + MultiplyVec3Mat33(src->normal[0], mat, dst->normal[0]); + MultiplyVec3Mat33(src->normal[1], mat, dst->normal[1]); + MultiplyVec3Mat33(src->normal[2], mat, dst->normal[2]); + dst->normal[0].normalize(); + } + else + { + MultiplyVec3Mat33(src->normal[0], mat, dst->normal[0]); + dst->normal[0].normalize(); + } +} + +inline void TransformTexCoordRegular(const TexMtxInfo &texinfo, int coordNum, bool specialCase, const InputVertexData *srcVertex, OutputVertexData *dstVertex) +{ + const Vec3 *src; + switch (texinfo.sourcerow) + { + case XF_SRCGEOM_INROW: + src = &srcVertex->position; + break; + case XF_SRCNORMAL_INROW: + src = &srcVertex->normal[0]; + break; + case XF_SRCBINORMAL_T_INROW: + src = &srcVertex->normal[1]; + break; + case XF_SRCBINORMAL_B_INROW: + src = &srcVertex->normal[2]; + break; + default: + _assert_(texinfo.sourcerow >= XF_SRCTEX0_INROW && texinfo.sourcerow <= XF_SRCTEX7_INROW); + src = (Vec3*)srcVertex->texCoords[texinfo.sourcerow - XF_SRCTEX0_INROW]; + break; + } + + const float *mat = (const float*)&xfregs.posMatrices[srcVertex->texMtx[coordNum] * 4]; + Vec3 *dst = &dstVertex->texCoords[coordNum]; + + if (texinfo.inputform == XF_TEXINPUT_AB11) + { + MultiplyVec2Mat34(*src, mat, *dst); + } + else + { + MultiplyVec3Mat34(*src, mat, *dst); + } + + if (xfregs.dualTexTrans) + { + Vec3 tempCoord; + + // normalize + const PostMtxInfo &postInfo = xfregs.postMtxInfo[coordNum]; + const float *postMat = (const float*)&xfregs.postMatrices[postInfo.index * 4]; + + if (specialCase) + { + // no normalization + // q of input is 1 + // q of output is unknown + tempCoord.x = dst->x; + tempCoord.y = dst->y; + + dst->x = postMat[0] * tempCoord.x + postMat[1] * tempCoord.y + postMat[2] + postMat[3]; + dst->y = postMat[4] * tempCoord.x + postMat[5] * tempCoord.y + postMat[6] + postMat[7]; + dst->z = 1.0f; + } + else + { + if (postInfo.normalize) + tempCoord = dst->normalized(); + else + tempCoord = *dst; + + MultiplyVec3Mat34(tempCoord, postMat, *dst); + } + } +} + +struct LightPointer +{ + u32 reserved[3]; + u8 color[4]; + Vec3 cosatt; + Vec3 distatt; + Vec3 pos; + Vec3 dir; +}; + +inline void AddIntegerColor(const u8 *src, Vec3 &dst) +{ + dst.x += src[1]; + dst.y += src[2]; + dst.z += src[3]; +} + +inline void AddScaledIntegerColor(const u8 *src, float scale, Vec3 &dst) +{ + dst.x += src[1] * scale; + dst.y += src[2] * scale; + dst.z += src[3] * scale; +} + +inline float Clamp(float val, float a, float b) +{ + return val<a?a:val>b?b:val; +} + +inline float SafeDivide(float n, float d) +{ + return (d==0)?(n>0?1:0):n/d; +} + +void LightColor(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChannel &chan, Vec3 &lightCol) +{ + const LightPointer *light = (const LightPointer*)&xfregs.lights[0x10*lightNum]; + + if (!(chan.attnfunc & 1)) { + // atten disabled + switch (chan.diffusefunc) { + case LIGHTDIF_NONE: + AddIntegerColor(light->color, lightCol); + break; + case LIGHTDIF_SIGN: + { + Vec3 ldir = (light->pos - pos).normalized(); + float diffuse = ldir * normal; + AddScaledIntegerColor(light->color, diffuse, lightCol); + } + break; + case LIGHTDIF_CLAMP: + { + Vec3 ldir = (light->pos - pos).normalized(); + float diffuse = max(0.0f, ldir * normal); + AddScaledIntegerColor(light->color, diffuse, lightCol); + } + break; + default: _assert_(0); + } + } + else { // spec and spot + // not sure about divide by zero checks + Vec3 ldir = light->pos - pos; + float attn; + + if (chan.attnfunc == 3) { // spot + float dist2 = ldir.length2(); + float dist = sqrtf(dist2); + ldir = ldir / dist; + attn = max(0.0f, ldir * light->dir); + + float cosAtt = light->cosatt.x + (light->cosatt.y * attn) + (light->cosatt.z * attn * attn); + float distAtt = light->distatt.x + (light->distatt.y * dist) + (light->distatt.z * dist2); + attn = SafeDivide(max(0.0f, cosAtt), distAtt); + } + else if (chan.attnfunc == 1) { // specular + // donko - what is going on here? 655.36 is a guess but seems about right. + attn = (light->pos * normal) > -655.36 ? max(0.0f, (light->dir * normal)) : 0; + ldir.set(1.0f, attn, attn * attn); + + float cosAtt = max(0.0f, light->cosatt * ldir); + float distAtt = light->distatt * ldir; + attn = SafeDivide(max(0.0f, cosAtt), distAtt); + } else { PanicAlert("LightColor"); return; - } - - switch (chan.diffusefunc) { - case LIGHTDIF_NONE: - AddScaledIntegerColor(light->color, attn, lightCol); - break; - case LIGHTDIF_SIGN: - { - float difAttn = ldir * normal; - AddScaledIntegerColor(light->color, attn * difAttn, lightCol); - } - break; - - case LIGHTDIF_CLAMP: - { - float difAttn = max(0.0f, ldir * normal); - AddScaledIntegerColor(light->color, attn * difAttn, lightCol); - } - break; - default: _assert_(0); - } - } -} - -void LightAlpha(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChannel &chan, float &lightCol) -{ - const LightPointer *light = (const LightPointer*)&xfregs.lights[0x10*lightNum]; - - if (!(chan.attnfunc & 1)) { - // atten disabled - switch (chan.diffusefunc) { - case LIGHTDIF_NONE: - lightCol += light->color[0]; - break; - case LIGHTDIF_SIGN: - { - Vec3 ldir = (light->pos - pos).normalized(); - float diffuse = ldir * normal; - lightCol += light->color[0] * diffuse; - } - break; - case LIGHTDIF_CLAMP: - { - Vec3 ldir = (light->pos - pos).normalized(); - float diffuse = max(0.0f, ldir * normal); - lightCol += light->color[0] * diffuse; - } - break; - default: _assert_(0); - } - } - else { // spec and spot - Vec3 ldir = light->pos - pos; - float attn; - - if (chan.attnfunc == 3) { // spot - float dist2 = ldir.length2(); - float dist = sqrtf(dist2); - ldir = ldir / dist; - attn = max(0.0f, ldir * light->dir); - - float cosAtt = light->cosatt.x + (light->cosatt.y * attn) + (light->cosatt.z * attn * attn); - float distAtt = light->distatt.x + (light->distatt.y * dist) + (light->distatt.z * dist2); - attn = SafeDivide(max(0.0f, cosAtt), distAtt); - } - else /* if (chan.attnfunc == 1) */ { // specular - // donko - what is going on here? 655.36 is a guess but seems about right. - attn = (light->pos * normal) > -655.36 ? max(0.0f, (light->dir * normal)) : 0; - ldir.set(1.0f, attn, attn * attn); - - float cosAtt = light->cosatt * ldir; - float distAtt = light->distatt * ldir; - attn = SafeDivide(max(0.0f, cosAtt), distAtt); - } - - switch (chan.diffusefunc) { - case LIGHTDIF_NONE: - lightCol += light->color[0] * attn; - break; - case LIGHTDIF_SIGN: - { - float difAttn = ldir * normal; - lightCol += light->color[0] * attn * difAttn; - } - break; - - case LIGHTDIF_CLAMP: - { - float difAttn = max(0.0f, ldir * normal); - lightCol += light->color[0] * attn * difAttn; - } - break; - default: _assert_(0); - } - } -} - -void TransformColor(const InputVertexData *src, OutputVertexData *dst) -{ - for (u32 chan = 0; chan < xfregs.nNumChans; chan++) - { - // abgr - u8 matcolor[4]; - u8 chancolor[4]; - - // color - LitChannel &colorchan = xfregs.color[chan]; - if (colorchan.matsource) - *(u32*)matcolor = *(u32*)src->color[chan]; // vertex - else - *(u32*)matcolor = xfregs.matColor[chan]; - - if (colorchan.enablelighting) - { - Vec3 lightCol; - if (colorchan.ambsource) - { - // vertex - lightCol.x = src->color[chan][1]; - lightCol.y = src->color[chan][2]; - lightCol.z = src->color[chan][3]; - } - else - { - u8 *ambColor = (u8*)&xfregs.ambColor[chan]; - lightCol.x = ambColor[1]; - lightCol.y = ambColor[2]; - lightCol.z = ambColor[3]; - } - - u8 mask = colorchan.GetFullLightMask(); - for (int i = 0; i < 8; ++i) { - if (mask&(1<<i)) - LightColor(dst->mvPosition, dst->normal[0], i, colorchan, lightCol); - } - - float inv = 1.0f / 255.0f; - chancolor[1] = (u8)(matcolor[1] * Clamp(lightCol.x * inv, 0.0f, 1.0f)); - chancolor[2] = (u8)(matcolor[2] * Clamp(lightCol.y * inv, 0.0f, 1.0f)); - chancolor[3] = (u8)(matcolor[3] * Clamp(lightCol.z * inv, 0.0f, 1.0f)); - } - else - { - *(u32*)chancolor = *(u32*)matcolor; - } - - // alpha - LitChannel &alphachan = xfregs.alpha[chan]; - if (alphachan.matsource) - matcolor[0] = src->color[chan][0]; // vertex - else - matcolor[0] = xfregs.matColor[chan] & 0xff; - - if (xfregs.alpha[chan].enablelighting) - { - float lightCol; - if (alphachan.ambsource) - lightCol = src->color[chan][0]; // vertex - else - lightCol = (float)(xfregs.ambColor[chan] & 0xff); - - u8 mask = alphachan.GetFullLightMask(); - for (int i = 0; i < 8; ++i) { - if (mask&(1<<i)) - LightAlpha(dst->mvPosition, dst->normal[0], i, alphachan, lightCol); - } - - chancolor[0] = (u8)(matcolor[0] * Clamp(lightCol / 255.0f, 0.0f, 1.0f)); - } - else - { - chancolor[0] = matcolor[0]; - } - - // abgr -> rgba - *(u32*)dst->color[chan] = Common::swap32(*(u32*)chancolor); - } -} - -void TransformTexCoord(const InputVertexData *src, OutputVertexData *dst, bool specialCase) -{ - for (u32 coordNum = 0; coordNum < xfregs.numTexGens; coordNum++) - { - const TexMtxInfo &texinfo = xfregs.texMtxInfo[coordNum]; - - switch (texinfo.texgentype) - { - case XF_TEXGEN_REGULAR: - TransformTexCoordRegular(texinfo, coordNum, specialCase, src, dst); - break; - case XF_TEXGEN_EMBOSS_MAP: - { - const LightPointer *light = (const LightPointer*)&xfregs.lights[0x10*texinfo.embosslightshift]; - - Vec3 ldir = (light->pos - dst->mvPosition).normalized(); - float d1 = ldir * dst->normal[1]; - float d2 = ldir * dst->normal[2]; - - dst->texCoords[coordNum].x = dst->texCoords[texinfo.embosssourceshift].x + d1; - dst->texCoords[coordNum].y = dst->texCoords[texinfo.embosssourceshift].y + d2; - dst->texCoords[coordNum].z = dst->texCoords[texinfo.embosssourceshift].z; - } - break; - case XF_TEXGEN_COLOR_STRGBC0: - _assert_(texinfo.sourcerow == XF_SRCCOLORS_INROW); - _assert_(texinfo.inputform == XF_TEXINPUT_AB11); - dst->texCoords[coordNum].x = (float)dst->color[0][0] / 255.0f; - dst->texCoords[coordNum].y = (float)dst->color[0][1] / 255.0f; - dst->texCoords[coordNum].z = 1.0f; - break; - case XF_TEXGEN_COLOR_STRGBC1: - _assert_(texinfo.sourcerow == XF_SRCCOLORS_INROW); - _assert_(texinfo.inputform == XF_TEXINPUT_AB11); - dst->texCoords[coordNum].x = (float)dst->color[1][0] / 255.0f; - dst->texCoords[coordNum].y = (float)dst->color[1][1] / 255.0f; - dst->texCoords[coordNum].z = 1.0f; - break; - default: - ERROR_LOG(VIDEO, "Bad tex gen type %i", texinfo.texgentype); - } - } - - for (u32 coordNum = 0; coordNum < xfregs.numTexGens; coordNum++) - { - dst->texCoords[coordNum][0] *= (bpmem.texcoords[coordNum].s.scale_minus_1 + 1); - dst->texCoords[coordNum][1] *= (bpmem.texcoords[coordNum].t.scale_minus_1 + 1); - } -} - -} + } + + switch (chan.diffusefunc) { + case LIGHTDIF_NONE: + AddScaledIntegerColor(light->color, attn, lightCol); + break; + case LIGHTDIF_SIGN: + { + float difAttn = ldir * normal; + AddScaledIntegerColor(light->color, attn * difAttn, lightCol); + } + break; + + case LIGHTDIF_CLAMP: + { + float difAttn = max(0.0f, ldir * normal); + AddScaledIntegerColor(light->color, attn * difAttn, lightCol); + } + break; + default: _assert_(0); + } + } +} + +void LightAlpha(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChannel &chan, float &lightCol) +{ + const LightPointer *light = (const LightPointer*)&xfregs.lights[0x10*lightNum]; + + if (!(chan.attnfunc & 1)) { + // atten disabled + switch (chan.diffusefunc) { + case LIGHTDIF_NONE: + lightCol += light->color[0]; + break; + case LIGHTDIF_SIGN: + { + Vec3 ldir = (light->pos - pos).normalized(); + float diffuse = ldir * normal; + lightCol += light->color[0] * diffuse; + } + break; + case LIGHTDIF_CLAMP: + { + Vec3 ldir = (light->pos - pos).normalized(); + float diffuse = max(0.0f, ldir * normal); + lightCol += light->color[0] * diffuse; + } + break; + default: _assert_(0); + } + } + else { // spec and spot + Vec3 ldir = light->pos - pos; + float attn; + + if (chan.attnfunc == 3) { // spot + float dist2 = ldir.length2(); + float dist = sqrtf(dist2); + ldir = ldir / dist; + attn = max(0.0f, ldir * light->dir); + + float cosAtt = light->cosatt.x + (light->cosatt.y * attn) + (light->cosatt.z * attn * attn); + float distAtt = light->distatt.x + (light->distatt.y * dist) + (light->distatt.z * dist2); + attn = SafeDivide(max(0.0f, cosAtt), distAtt); + } + else /* if (chan.attnfunc == 1) */ { // specular + // donko - what is going on here? 655.36 is a guess but seems about right. + attn = (light->pos * normal) > -655.36 ? max(0.0f, (light->dir * normal)) : 0; + ldir.set(1.0f, attn, attn * attn); + + float cosAtt = light->cosatt * ldir; + float distAtt = light->distatt * ldir; + attn = SafeDivide(max(0.0f, cosAtt), distAtt); + } + + switch (chan.diffusefunc) { + case LIGHTDIF_NONE: + lightCol += light->color[0] * attn; + break; + case LIGHTDIF_SIGN: + { + float difAttn = ldir * normal; + lightCol += light->color[0] * attn * difAttn; + } + break; + + case LIGHTDIF_CLAMP: + { + float difAttn = max(0.0f, ldir * normal); + lightCol += light->color[0] * attn * difAttn; + } + break; + default: _assert_(0); + } + } +} + +void TransformColor(const InputVertexData *src, OutputVertexData *dst) +{ + for (u32 chan = 0; chan < xfregs.nNumChans; chan++) + { + // abgr + u8 matcolor[4]; + u8 chancolor[4]; + + // color + LitChannel &colorchan = xfregs.color[chan]; + if (colorchan.matsource) + *(u32*)matcolor = *(u32*)src->color[chan]; // vertex + else + *(u32*)matcolor = xfregs.matColor[chan]; + + if (colorchan.enablelighting) + { + Vec3 lightCol; + if (colorchan.ambsource) + { + // vertex + lightCol.x = src->color[chan][1]; + lightCol.y = src->color[chan][2]; + lightCol.z = src->color[chan][3]; + } + else + { + u8 *ambColor = (u8*)&xfregs.ambColor[chan]; + lightCol.x = ambColor[1]; + lightCol.y = ambColor[2]; + lightCol.z = ambColor[3]; + } + + u8 mask = colorchan.GetFullLightMask(); + for (int i = 0; i < 8; ++i) { + if (mask&(1<<i)) + LightColor(dst->mvPosition, dst->normal[0], i, colorchan, lightCol); + } + + float inv = 1.0f / 255.0f; + chancolor[1] = (u8)(matcolor[1] * Clamp(lightCol.x * inv, 0.0f, 1.0f)); + chancolor[2] = (u8)(matcolor[2] * Clamp(lightCol.y * inv, 0.0f, 1.0f)); + chancolor[3] = (u8)(matcolor[3] * Clamp(lightCol.z * inv, 0.0f, 1.0f)); + } + else + { + *(u32*)chancolor = *(u32*)matcolor; + } + + // alpha + LitChannel &alphachan = xfregs.alpha[chan]; + if (alphachan.matsource) + matcolor[0] = src->color[chan][0]; // vertex + else + matcolor[0] = xfregs.matColor[chan] & 0xff; + + if (xfregs.alpha[chan].enablelighting) + { + float lightCol; + if (alphachan.ambsource) + lightCol = src->color[chan][0]; // vertex + else + lightCol = (float)(xfregs.ambColor[chan] & 0xff); + + u8 mask = alphachan.GetFullLightMask(); + for (int i = 0; i < 8; ++i) { + if (mask&(1<<i)) + LightAlpha(dst->mvPosition, dst->normal[0], i, alphachan, lightCol); + } + + chancolor[0] = (u8)(matcolor[0] * Clamp(lightCol / 255.0f, 0.0f, 1.0f)); + } + else + { + chancolor[0] = matcolor[0]; + } + + // abgr -> rgba + *(u32*)dst->color[chan] = Common::swap32(*(u32*)chancolor); + } +} + +void TransformTexCoord(const InputVertexData *src, OutputVertexData *dst, bool specialCase) +{ + for (u32 coordNum = 0; coordNum < xfregs.numTexGens; coordNum++) + { + const TexMtxInfo &texinfo = xfregs.texMtxInfo[coordNum]; + + switch (texinfo.texgentype) + { + case XF_TEXGEN_REGULAR: + TransformTexCoordRegular(texinfo, coordNum, specialCase, src, dst); + break; + case XF_TEXGEN_EMBOSS_MAP: + { + const LightPointer *light = (const LightPointer*)&xfregs.lights[0x10*texinfo.embosslightshift]; + + Vec3 ldir = (light->pos - dst->mvPosition).normalized(); + float d1 = ldir * dst->normal[1]; + float d2 = ldir * dst->normal[2]; + + dst->texCoords[coordNum].x = dst->texCoords[texinfo.embosssourceshift].x + d1; + dst->texCoords[coordNum].y = dst->texCoords[texinfo.embosssourceshift].y + d2; + dst->texCoords[coordNum].z = dst->texCoords[texinfo.embosssourceshift].z; + } + break; + case XF_TEXGEN_COLOR_STRGBC0: + _assert_(texinfo.sourcerow == XF_SRCCOLORS_INROW); + _assert_(texinfo.inputform == XF_TEXINPUT_AB11); + dst->texCoords[coordNum].x = (float)dst->color[0][0] / 255.0f; + dst->texCoords[coordNum].y = (float)dst->color[0][1] / 255.0f; + dst->texCoords[coordNum].z = 1.0f; + break; + case XF_TEXGEN_COLOR_STRGBC1: + _assert_(texinfo.sourcerow == XF_SRCCOLORS_INROW); + _assert_(texinfo.inputform == XF_TEXINPUT_AB11); + dst->texCoords[coordNum].x = (float)dst->color[1][0] / 255.0f; + dst->texCoords[coordNum].y = (float)dst->color[1][1] / 255.0f; + dst->texCoords[coordNum].z = 1.0f; + break; + default: + ERROR_LOG(VIDEO, "Bad tex gen type %i", texinfo.texgentype); + } + } + + for (u32 coordNum = 0; coordNum < xfregs.numTexGens; coordNum++) + { + dst->texCoords[coordNum][0] *= (bpmem.texcoords[coordNum].s.scale_minus_1 + 1); + dst->texCoords[coordNum][1] *= (bpmem.texcoords[coordNum].t.scale_minus_1 + 1); + } +} + +} diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.h b/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.h index d45be8e3d8..d5085e5728 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/TransformUnit.h @@ -1,37 +1,37 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#ifndef _TRANSFORM_UNIT_H_ -#define _TRANSFORM_UNIT_H_ - -struct InputVertexData; -struct OutputVertexData; - -namespace TransformUnit -{ - void MultiplyVec2Mat24(const float *vec, const float *mat, float *result); - void MultiplyVec2Mat34(const float *vec, const float *mat, float *result); - void MultiplyVec3Mat33(const float *vec, const float *mat, float *result); - void MultiplyVec3Mat34(const float *vec, const float *mat, float *result); - - void TransformPosition(const InputVertexData *src, OutputVertexData *dst); - void TransformNormal(const InputVertexData *src, bool nbt, OutputVertexData *dst); - void TransformColor(const InputVertexData *src, OutputVertexData *dst); - void TransformTexCoord(const InputVertexData *src, OutputVertexData *dst, bool specialCase); -} - +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _TRANSFORM_UNIT_H_ +#define _TRANSFORM_UNIT_H_ + +struct InputVertexData; +struct OutputVertexData; + +namespace TransformUnit +{ + void MultiplyVec2Mat24(const float *vec, const float *mat, float *result); + void MultiplyVec2Mat34(const float *vec, const float *mat, float *result); + void MultiplyVec3Mat33(const float *vec, const float *mat, float *result); + void MultiplyVec3Mat34(const float *vec, const float *mat, float *result); + + void TransformPosition(const InputVertexData *src, OutputVertexData *dst); + void TransformNormal(const InputVertexData *src, bool nbt, OutputVertexData *dst); + void TransformColor(const InputVertexData *src, OutputVertexData *dst); + void TransformTexCoord(const InputVertexData *src, OutputVertexData *dst, bool specialCase); +} + #endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/VertexFormatConverter.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/VertexFormatConverter.cpp index f50220aaad..4dbb5e806d 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/VertexFormatConverter.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/VertexFormatConverter.cpp @@ -1,75 +1,75 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#include "Common.h" - -#include "VertexFormatConverter.h" - - -namespace VertexFormatConverter -{ - void LoadNormal1_Byte(InputVertexData *dst, u8 *src) - { - dst->normal[0].x = (float)(s8)src[0] / 128; - dst->normal[0].y = (float)(s8)src[1] / 128; - dst->normal[0].z = (float)(s8)src[2] / 128; - } - - void LoadNormal1_Short(InputVertexData *dst, u8 *src) - { - dst->normal[0].x = (float)((s16*)src)[0] / 32768; - dst->normal[0].y = (float)((s16*)src)[1] / 32768; - dst->normal[0].z = (float)((s16*)src)[2] / 32768; - } - - void LoadNormal1_Float(InputVertexData *dst, u8 *src) - { - dst->normal[0].x = ((float*)src)[0]; - dst->normal[0].y = ((float*)src)[1]; - dst->normal[0].z = ((float*)src)[2]; - } - - void LoadNormal3_Byte(InputVertexData *dst, u8 *src) - { - for (int i = 0, j = 0; i < 3; i++, j+=3) - { - dst->normal[i].x = (float)(s8)src[j + 0] / 128; - dst->normal[i].y = (float)(s8)src[j + 1] / 128; - dst->normal[i].z = (float)(s8)src[j + 2] / 128; - } - } - - void LoadNormal3_Short(InputVertexData *dst, u8 *src) - { - for (int i = 0, j = 0; i < 3; i++, j+=3) - { - dst->normal[i].x = (float)((s16*)src)[j + 0] / 32768; - dst->normal[i].y = (float)((s16*)src)[j + 1] / 32768; - dst->normal[i].z = (float)((s16*)src)[j + 2] / 32768; - } - } - - void LoadNormal3_Float(InputVertexData *dst, u8 *src) - { - for (int i = 0, j = 0; i < 3; i++, j+=3) - { - dst->normal[i].x = ((float*)src)[j + 0]; - dst->normal[i].y = ((float*)src)[j + 1]; - dst->normal[i].z = ((float*)src)[j + 2]; - } - } +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Common.h" + +#include "VertexFormatConverter.h" + + +namespace VertexFormatConverter +{ + void LoadNormal1_Byte(InputVertexData *dst, u8 *src) + { + dst->normal[0].x = (float)(s8)src[0] / 128; + dst->normal[0].y = (float)(s8)src[1] / 128; + dst->normal[0].z = (float)(s8)src[2] / 128; + } + + void LoadNormal1_Short(InputVertexData *dst, u8 *src) + { + dst->normal[0].x = (float)((s16*)src)[0] / 32768; + dst->normal[0].y = (float)((s16*)src)[1] / 32768; + dst->normal[0].z = (float)((s16*)src)[2] / 32768; + } + + void LoadNormal1_Float(InputVertexData *dst, u8 *src) + { + dst->normal[0].x = ((float*)src)[0]; + dst->normal[0].y = ((float*)src)[1]; + dst->normal[0].z = ((float*)src)[2]; + } + + void LoadNormal3_Byte(InputVertexData *dst, u8 *src) + { + for (int i = 0, j = 0; i < 3; i++, j+=3) + { + dst->normal[i].x = (float)(s8)src[j + 0] / 128; + dst->normal[i].y = (float)(s8)src[j + 1] / 128; + dst->normal[i].z = (float)(s8)src[j + 2] / 128; + } + } + + void LoadNormal3_Short(InputVertexData *dst, u8 *src) + { + for (int i = 0, j = 0; i < 3; i++, j+=3) + { + dst->normal[i].x = (float)((s16*)src)[j + 0] / 32768; + dst->normal[i].y = (float)((s16*)src)[j + 1] / 32768; + dst->normal[i].z = (float)((s16*)src)[j + 2] / 32768; + } + } + + void LoadNormal3_Float(InputVertexData *dst, u8 *src) + { + for (int i = 0, j = 0; i < 3; i++, j+=3) + { + dst->normal[i].x = ((float*)src)[j + 0]; + dst->normal[i].y = ((float*)src)[j + 1]; + dst->normal[i].z = ((float*)src)[j + 2]; + } + } } diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/VertexFormatConverter.h b/Source/Plugins/Plugin_VideoSoftware/Src/VertexFormatConverter.h index 2733813d73..d8ea7f38cc 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/VertexFormatConverter.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/VertexFormatConverter.h @@ -1,35 +1,35 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#ifndef _VERTEXFORMATCONVERTER_H -#define _VERTEXFORMATCONVERTER_H - -#include "NativeVertexFormat.h" - -namespace VertexFormatConverter -{ - typedef void (*NormalConverter)(InputVertexData*, u8*); - - void LoadNormal1_Byte(InputVertexData *dst, u8 *src); - void LoadNormal1_Short(InputVertexData *dst, u8 *src); - void LoadNormal1_Float(InputVertexData *dst, u8 *src); - void LoadNormal3_Byte(InputVertexData *dst, u8 *src); - void LoadNormal3_Short(InputVertexData *dst, u8 *src); - void LoadNormal3_Float(InputVertexData *dst, u8 *src); -} - +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _VERTEXFORMATCONVERTER_H +#define _VERTEXFORMATCONVERTER_H + +#include "NativeVertexFormat.h" + +namespace VertexFormatConverter +{ + typedef void (*NormalConverter)(InputVertexData*, u8*); + + void LoadNormal1_Byte(InputVertexData *dst, u8 *src); + void LoadNormal1_Short(InputVertexData *dst, u8 *src); + void LoadNormal1_Float(InputVertexData *dst, u8 *src); + void LoadNormal3_Byte(InputVertexData *dst, u8 *src); + void LoadNormal3_Short(InputVertexData *dst, u8 *src); + void LoadNormal3_Float(InputVertexData *dst, u8 *src); +} + #endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/VertexLoader.h b/Source/Plugins/Plugin_VideoSoftware/Src/VertexLoader.h index d1f2622e19..d5f152d27f 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/VertexLoader.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/VertexLoader.h @@ -1,78 +1,78 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#ifndef _VERTEXLOADER_H_ -#define _VERTEXLOADER_H_ - -#include "Common.h" - -#include "NativeVertexFormat.h" -#include "VertexFormatConverter.h" -#include "CPMemLoader.h" - -class SetupUnit; - -class VertexLoader -{ - u32 m_VertexSize; - - VAT* m_CurrentVat; - - TPipelineFunction m_positionLoader; - TPipelineFunction m_normalLoader; - TPipelineFunction m_colorLoader[2]; - TPipelineFunction m_texCoordLoader[8]; - - VertexFormatConverter::NormalConverter m_normalConverter; - - InputVertexData m_Vertex; - - typedef void (*AttributeLoader)(VertexLoader*, InputVertexData*, u8); - struct AttrLoaderCall - { - AttributeLoader loader; - u8 index; - }; - AttrLoaderCall m_AttributeLoaders[1+8+1+1+2+8]; - int m_NumAttributeLoaders; - void AddAttributeLoader(AttributeLoader loader, u8 index=0); - - // attribute loader functions - static void LoadPosMtx(VertexLoader *vertexLoader, InputVertexData *vertex, u8 unused); - static void LoadTexMtx(VertexLoader *vertexLoader, InputVertexData *vertex, u8 index); - static void LoadPosition(VertexLoader *vertexLoader, InputVertexData *vertex, u8 unused); - static void LoadNormal(VertexLoader *vertexLoader, InputVertexData *vertex, u8 unused); - static void LoadColor(VertexLoader *vertexLoader, InputVertexData *vertex, u8 index); - static void LoadTexCoord(VertexLoader *vertexLoader, InputVertexData *vertex, u8 index); - - SetupUnit *m_SetupUnit; - - bool m_TexGenSpecialCase; - -public: - VertexLoader(); - ~VertexLoader(); - - void SetFormat(u8 attributeIndex, u8 primitiveType); - - u32 GetVertexSize() { return m_VertexSize; } - - void LoadVertex(); - -}; - +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _VERTEXLOADER_H_ +#define _VERTEXLOADER_H_ + +#include "Common.h" + +#include "NativeVertexFormat.h" +#include "VertexFormatConverter.h" +#include "CPMemLoader.h" + +class SetupUnit; + +class VertexLoader +{ + u32 m_VertexSize; + + VAT* m_CurrentVat; + + TPipelineFunction m_positionLoader; + TPipelineFunction m_normalLoader; + TPipelineFunction m_colorLoader[2]; + TPipelineFunction m_texCoordLoader[8]; + + VertexFormatConverter::NormalConverter m_normalConverter; + + InputVertexData m_Vertex; + + typedef void (*AttributeLoader)(VertexLoader*, InputVertexData*, u8); + struct AttrLoaderCall + { + AttributeLoader loader; + u8 index; + }; + AttrLoaderCall m_AttributeLoaders[1+8+1+1+2+8]; + int m_NumAttributeLoaders; + void AddAttributeLoader(AttributeLoader loader, u8 index=0); + + // attribute loader functions + static void LoadPosMtx(VertexLoader *vertexLoader, InputVertexData *vertex, u8 unused); + static void LoadTexMtx(VertexLoader *vertexLoader, InputVertexData *vertex, u8 index); + static void LoadPosition(VertexLoader *vertexLoader, InputVertexData *vertex, u8 unused); + static void LoadNormal(VertexLoader *vertexLoader, InputVertexData *vertex, u8 unused); + static void LoadColor(VertexLoader *vertexLoader, InputVertexData *vertex, u8 index); + static void LoadTexCoord(VertexLoader *vertexLoader, InputVertexData *vertex, u8 index); + + SetupUnit *m_SetupUnit; + + bool m_TexGenSpecialCase; + +public: + VertexLoader(); + ~VertexLoader(); + + void SetFormat(u8 attributeIndex, u8 primitiveType); + + u32 GetVertexSize() { return m_VertexSize; } + + void LoadVertex(); + +}; + #endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/VertexLoader_Position.h b/Source/Plugins/Plugin_VideoSoftware/Src/VertexLoader_Position.h index a60d3deb76..a4474cd660 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/VertexLoader_Position.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/VertexLoader_Position.h @@ -1,20 +1,20 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#include "NativeVertexFormat.h" - +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "NativeVertexFormat.h" + #include "../../../Core/VideoCommon/Src/VertexLoader_Position.h" diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/XFMemLoader.h b/Source/Plugins/Plugin_VideoSoftware/Src/XFMemLoader.h index f9adbeabac..008c2e195a 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/XFMemLoader.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/XFMemLoader.h @@ -1,249 +1,249 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#ifndef _XFMEMLOADER_H_ -#define _XFMEMLOADER_H_ - - -#include "Common.h" - -///////////// -// Lighting -///////////// - -#define XF_TEXPROJ_ST 0 -#define XF_TEXPROJ_STQ 1 - -#define XF_TEXINPUT_AB11 0 -#define XF_TEXINPUT_ABC1 1 - -#define XF_TEXGEN_REGULAR 0 -#define XF_TEXGEN_EMBOSS_MAP 1 // used when bump mapping -#define XF_TEXGEN_COLOR_STRGBC0 2 -#define XF_TEXGEN_COLOR_STRGBC1 3 - -#define XF_SRCGEOM_INROW 0 // input is abc -#define XF_SRCNORMAL_INROW 1 // input is abc -#define XF_SRCCOLORS_INROW 2 -#define XF_SRCBINORMAL_T_INROW 3 // input is abc -#define XF_SRCBINORMAL_B_INROW 4 // input is abc -#define XF_SRCTEX0_INROW 5 -#define XF_SRCTEX1_INROW 6 -#define XF_SRCTEX2_INROW 7 -#define XF_SRCTEX3_INROW 8 -#define XF_SRCTEX4_INROW 9 -#define XF_SRCTEX5_INROW 10 -#define XF_SRCTEX6_INROW 11 -#define XF_SRCTEX7_INROW 12 - -#define GX_SRC_REG 0 -#define GX_SRC_VTX 1 - -struct Light -{ - u32 useless[3]; - u32 color; //rgba - float a0; //attenuation - float a1; - float a2; - float k0; //k stuff - float k1; - float k2; - union - { - struct { - float dpos[3]; - float ddir[3]; // specular lights only - }; - struct { - float sdir[3]; - float shalfangle[3]; // specular lights only - }; - }; -}; - -#define LIGHTDIF_NONE 0 -#define LIGHTDIF_SIGN 1 -#define LIGHTDIF_CLAMP 2 - -#define LIGHTATTN_SPEC 0 // specular attenuation -#define LIGHTATTN_SPOT 1 // distance/spotlight attenuation -#define LIGHTATTN_NONE 2 -#define LIGHTATTN_DIR 3 - -union LitChannel -{ - struct - { - unsigned matsource : 1; - unsigned enablelighting : 1; - unsigned lightMask0_3 : 4; - unsigned ambsource : 1; - unsigned diffusefunc : 2; // LIGHTDIF_X - unsigned attnfunc : 2; // LIGHTATTN_X - unsigned lightMask4_7 : 4; - unsigned unused : 17; - }; - u32 hex; - unsigned int GetFullLightMask() const - { - return enablelighting ? (lightMask0_3 | (lightMask4_7 << 4)) : 0; - } -}; - -union INVTXSPEC -{ - struct - { - unsigned numcolors : 2; - unsigned numnormals : 2; // 0 - nothing, 1 - just normal, 2 - normals and binormals - unsigned numtextures : 4; - unsigned unused : 24; - }; - u32 hex; -}; - -union TXFMatrixIndexA -{ - struct - { - unsigned PosNormalMtxIdx : 6; - unsigned Tex0MtxIdx : 6; - unsigned Tex1MtxIdx : 6; - unsigned Tex2MtxIdx : 6; - unsigned Tex3MtxIdx : 6; - }; - struct - { - u32 Hex : 30; - u32 unused : 2; - }; -}; - -union TXFMatrixIndexB -{ - struct - { - unsigned Tex4MtxIdx : 6; - unsigned Tex5MtxIdx : 6; - unsigned Tex6MtxIdx : 6; - unsigned Tex7MtxIdx : 6; - }; - struct - { - u32 Hex : 24; - u32 unused : 8; - }; -}; - -struct Viewport -{ - float wd; - float ht; - float zRange; - float xOrig; - float yOrig; - float farZ; -}; - -union TexMtxInfo -{ - struct - { - unsigned unknown : 1; - unsigned projection : 1; // XF_TEXPROJ_X - unsigned inputform : 2; // XF_TEXINPUT_X - unsigned texgentype : 3; // XF_TEXGEN_X - unsigned sourcerow : 5; // XF_SRCGEOM_X - unsigned embosssourceshift : 3; // what generated texcoord to use - unsigned embosslightshift : 3; // light index that is used - }; - u32 hex; -}; - -union PostMtxInfo -{ - struct - { - unsigned index : 6; // base row of dual transform matrix - unsigned unused : 2; - unsigned normalize : 1; // normalize before send operation - }; - u32 hex; -}; - -struct XFRegisters -{ - u32 posMatrices[256]; // 0x0000 - 0x00ff - u32 unk0[768]; // 0x0100 - 0x03ff - u32 normalMatrices[96]; // 0x0400 - 0x045f - u32 unk1[160]; // 0x0460 - 0x04ff - u32 postMatrices[256]; // 0x0500 - 0x05ff - u32 lights[128]; // 0x0600 - 0x067f - u32 unk2[2432]; // 0x0680 - 0x0fff - u32 error; // 0x1000 - u32 diag; // 0x1001 - u32 state0; // 0x1002 - u32 state1; // 0x1003 - u32 xfClock; // 0x1004 - u32 clipDisable; // 0x1005 - u32 perf0; // 0x1006 - u32 perf1; // 0x1007 - INVTXSPEC hostinfo; // 0x1008 number of textures,colors,normals from vertex input - u32 nNumChans; // 0x1009 - u32 ambColor[2]; // 0x100a, 0x100b - u32 matColor[2]; // 0x100c, 0x100d - LitChannel color[2]; // 0x100e, 0x100f - LitChannel alpha[2]; // 0x1010, 0x1011 - u32 dualTexTrans; // 0x1012 - u32 unk3; // 0x1013 - u32 unk4; // 0x1014 - u32 unk5; // 0x1015 - u32 unk6; // 0x1016 - u32 unk7; // 0x1017 - TXFMatrixIndexA MatrixIndexA; // 0x1018 - TXFMatrixIndexB MatrixIndexB; // 0x1019 - Viewport viewport; // 0x101a - 0x101f - float projection[7]; // 0x1020 - 0x1026 - u32 unk8[24]; // 0x1027 - 0x103e - u32 numTexGens; // 0x103f - TexMtxInfo texMtxInfo[8]; // 0x1040 - 0x1047 - u32 unk9[8]; // 0x1048 - 0x104f - PostMtxInfo postMtxInfo[8]; // 0x1050 - 0x1057 -}; - -#define XFMEM_POSMATRICES 0x000 -#define XFMEM_POSMATRICES_END 0x100 -#define XFMEM_NORMALMATRICES 0x400 -#define XFMEM_NORMALMATRICES_END 0x460 -#define XFMEM_POSTMATRICES 0x500 -#define XFMEM_POSTMATRICES_END 0x600 -#define XFMEM_LIGHTS 0x600 -#define XFMEM_LIGHTS_END 0x680 - - -extern XFRegisters xfregs; - -void InitXFMemory(); - -void XFWritten(u32 transferSize, u32 baseAddress); - -void LoadXFReg(u32 transferSize, u32 baseAddress, u32 *pData); - -void LoadIndexedXF(u32 val, int array); - +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _XFMEMLOADER_H_ +#define _XFMEMLOADER_H_ + + +#include "Common.h" + +///////////// +// Lighting +///////////// + +#define XF_TEXPROJ_ST 0 +#define XF_TEXPROJ_STQ 1 + +#define XF_TEXINPUT_AB11 0 +#define XF_TEXINPUT_ABC1 1 + +#define XF_TEXGEN_REGULAR 0 +#define XF_TEXGEN_EMBOSS_MAP 1 // used when bump mapping +#define XF_TEXGEN_COLOR_STRGBC0 2 +#define XF_TEXGEN_COLOR_STRGBC1 3 + +#define XF_SRCGEOM_INROW 0 // input is abc +#define XF_SRCNORMAL_INROW 1 // input is abc +#define XF_SRCCOLORS_INROW 2 +#define XF_SRCBINORMAL_T_INROW 3 // input is abc +#define XF_SRCBINORMAL_B_INROW 4 // input is abc +#define XF_SRCTEX0_INROW 5 +#define XF_SRCTEX1_INROW 6 +#define XF_SRCTEX2_INROW 7 +#define XF_SRCTEX3_INROW 8 +#define XF_SRCTEX4_INROW 9 +#define XF_SRCTEX5_INROW 10 +#define XF_SRCTEX6_INROW 11 +#define XF_SRCTEX7_INROW 12 + +#define GX_SRC_REG 0 +#define GX_SRC_VTX 1 + +struct Light +{ + u32 useless[3]; + u32 color; //rgba + float a0; //attenuation + float a1; + float a2; + float k0; //k stuff + float k1; + float k2; + union + { + struct { + float dpos[3]; + float ddir[3]; // specular lights only + }; + struct { + float sdir[3]; + float shalfangle[3]; // specular lights only + }; + }; +}; + +#define LIGHTDIF_NONE 0 +#define LIGHTDIF_SIGN 1 +#define LIGHTDIF_CLAMP 2 + +#define LIGHTATTN_SPEC 0 // specular attenuation +#define LIGHTATTN_SPOT 1 // distance/spotlight attenuation +#define LIGHTATTN_NONE 2 +#define LIGHTATTN_DIR 3 + +union LitChannel +{ + struct + { + unsigned matsource : 1; + unsigned enablelighting : 1; + unsigned lightMask0_3 : 4; + unsigned ambsource : 1; + unsigned diffusefunc : 2; // LIGHTDIF_X + unsigned attnfunc : 2; // LIGHTATTN_X + unsigned lightMask4_7 : 4; + unsigned unused : 17; + }; + u32 hex; + unsigned int GetFullLightMask() const + { + return enablelighting ? (lightMask0_3 | (lightMask4_7 << 4)) : 0; + } +}; + +union INVTXSPEC +{ + struct + { + unsigned numcolors : 2; + unsigned numnormals : 2; // 0 - nothing, 1 - just normal, 2 - normals and binormals + unsigned numtextures : 4; + unsigned unused : 24; + }; + u32 hex; +}; + +union TXFMatrixIndexA +{ + struct + { + unsigned PosNormalMtxIdx : 6; + unsigned Tex0MtxIdx : 6; + unsigned Tex1MtxIdx : 6; + unsigned Tex2MtxIdx : 6; + unsigned Tex3MtxIdx : 6; + }; + struct + { + u32 Hex : 30; + u32 unused : 2; + }; +}; + +union TXFMatrixIndexB +{ + struct + { + unsigned Tex4MtxIdx : 6; + unsigned Tex5MtxIdx : 6; + unsigned Tex6MtxIdx : 6; + unsigned Tex7MtxIdx : 6; + }; + struct + { + u32 Hex : 24; + u32 unused : 8; + }; +}; + +struct Viewport +{ + float wd; + float ht; + float zRange; + float xOrig; + float yOrig; + float farZ; +}; + +union TexMtxInfo +{ + struct + { + unsigned unknown : 1; + unsigned projection : 1; // XF_TEXPROJ_X + unsigned inputform : 2; // XF_TEXINPUT_X + unsigned texgentype : 3; // XF_TEXGEN_X + unsigned sourcerow : 5; // XF_SRCGEOM_X + unsigned embosssourceshift : 3; // what generated texcoord to use + unsigned embosslightshift : 3; // light index that is used + }; + u32 hex; +}; + +union PostMtxInfo +{ + struct + { + unsigned index : 6; // base row of dual transform matrix + unsigned unused : 2; + unsigned normalize : 1; // normalize before send operation + }; + u32 hex; +}; + +struct XFRegisters +{ + u32 posMatrices[256]; // 0x0000 - 0x00ff + u32 unk0[768]; // 0x0100 - 0x03ff + u32 normalMatrices[96]; // 0x0400 - 0x045f + u32 unk1[160]; // 0x0460 - 0x04ff + u32 postMatrices[256]; // 0x0500 - 0x05ff + u32 lights[128]; // 0x0600 - 0x067f + u32 unk2[2432]; // 0x0680 - 0x0fff + u32 error; // 0x1000 + u32 diag; // 0x1001 + u32 state0; // 0x1002 + u32 state1; // 0x1003 + u32 xfClock; // 0x1004 + u32 clipDisable; // 0x1005 + u32 perf0; // 0x1006 + u32 perf1; // 0x1007 + INVTXSPEC hostinfo; // 0x1008 number of textures,colors,normals from vertex input + u32 nNumChans; // 0x1009 + u32 ambColor[2]; // 0x100a, 0x100b + u32 matColor[2]; // 0x100c, 0x100d + LitChannel color[2]; // 0x100e, 0x100f + LitChannel alpha[2]; // 0x1010, 0x1011 + u32 dualTexTrans; // 0x1012 + u32 unk3; // 0x1013 + u32 unk4; // 0x1014 + u32 unk5; // 0x1015 + u32 unk6; // 0x1016 + u32 unk7; // 0x1017 + TXFMatrixIndexA MatrixIndexA; // 0x1018 + TXFMatrixIndexB MatrixIndexB; // 0x1019 + Viewport viewport; // 0x101a - 0x101f + float projection[7]; // 0x1020 - 0x1026 + u32 unk8[24]; // 0x1027 - 0x103e + u32 numTexGens; // 0x103f + TexMtxInfo texMtxInfo[8]; // 0x1040 - 0x1047 + u32 unk9[8]; // 0x1048 - 0x104f + PostMtxInfo postMtxInfo[8]; // 0x1050 - 0x1057 +}; + +#define XFMEM_POSMATRICES 0x000 +#define XFMEM_POSMATRICES_END 0x100 +#define XFMEM_NORMALMATRICES 0x400 +#define XFMEM_NORMALMATRICES_END 0x460 +#define XFMEM_POSTMATRICES 0x500 +#define XFMEM_POSTMATRICES_END 0x600 +#define XFMEM_LIGHTS 0x600 +#define XFMEM_LIGHTS_END 0x680 + + +extern XFRegisters xfregs; + +void InitXFMemory(); + +void XFWritten(u32 transferSize, u32 baseAddress); + +void LoadXFReg(u32 transferSize, u32 baseAddress, u32 *pData); + +void LoadIndexedXF(u32 val, int array); + #endif