mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-14 13:27:45 -07:00
Some leftover work from unfinished DX9 Access EFB. In DSP HLE, 0x0004,7,b,c are almost done, all that's left to do is resample from 0x50 to _Size.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4313 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
750ad4fb5d
commit
ebfceb16b9
@ -116,6 +116,32 @@ void CUCode_Zelda::RenderSynth_Constant(ZeldaVoicePB &PB, s32* _Buffer, int _Siz
|
|||||||
_Buffer[i] = (s32)PB.RatioInt;
|
_Buffer[i] = (s32)PB.RatioInt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A piece of code from LLE so we can see how the wrap register affects the sound
|
||||||
|
|
||||||
|
// HORRIBLE UGLINESS, someone please fix.
|
||||||
|
// See http://code.google.com/p/dolphin-emu/source/detail?r=3125
|
||||||
|
inline u16 ToMask(u16 a)
|
||||||
|
{
|
||||||
|
a = a | (a >> 8);
|
||||||
|
a = a | (a >> 4);
|
||||||
|
a = a | (a >> 2);
|
||||||
|
return a | (a >> 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline s16 AddValueToReg(s16 reg, s32 value)
|
||||||
|
{
|
||||||
|
s16 tmp = reg;
|
||||||
|
u16 tmb = ToMask(0x003f);
|
||||||
|
|
||||||
|
for(int i = 0; i < value; i++) {
|
||||||
|
if ((tmp & tmb) == tmb)
|
||||||
|
tmp ^= 0x003f;
|
||||||
|
else
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
void CUCode_Zelda::RenderSynth_WaveTable(ZeldaVoicePB &PB, s32* _Buffer, int _Size)
|
void CUCode_Zelda::RenderSynth_WaveTable(ZeldaVoicePB &PB, s32* _Buffer, int _Size)
|
||||||
{
|
{
|
||||||
@ -139,24 +165,24 @@ void CUCode_Zelda::RenderSynth_WaveTable(ZeldaVoicePB &PB, s32* _Buffer, int _Si
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: What about the 0x003f wrap register?
|
// TODO: Resample this!
|
||||||
|
WARN_LOG(DSPHLE, "Synthesizing the incomplete format 0x%04x", PB.Format);
|
||||||
|
|
||||||
//WARN_LOG(DSPHLE, "Not synthesizing un-REd format 0x%04x", PB.Format);
|
|
||||||
u64 ACC0 = PB.CurSampleFrac << 6;
|
u64 ACC0 = PB.CurSampleFrac << 6;
|
||||||
|
|
||||||
ACC0 &= 0x3f0000;
|
ACC0 &= 0xffff003fffff;
|
||||||
|
|
||||||
address += (ACC0 >> 16);
|
address = AddValueToReg(address, ((ACC0 >> 16) & 0xffff));
|
||||||
ACC0 &= 0xffff;
|
ACC0 &= 0xffff0000ffff;
|
||||||
|
|
||||||
for(int i = 0; i < _Size; i++)
|
for(int i = 0; i < _Size; i++)
|
||||||
{
|
{
|
||||||
_Buffer[i] = m_MiscTable[address];
|
_Buffer[i] = m_MiscTable[address];
|
||||||
|
|
||||||
ACC0 += PB.RatioInt << 5;
|
ACC0 += PB.RatioInt << 5;
|
||||||
address += ((ACC0 >> 16) & 0x003f);
|
address = AddValueToReg(address, ((ACC0 >> 16) & 0xffff));
|
||||||
|
|
||||||
ACC0 &= 0xffff;
|
ACC0 &= 0xffff0000ffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
ACC0 = address << 16;
|
ACC0 = address << 16;
|
||||||
|
@ -142,6 +142,7 @@ bool Renderer::Init()
|
|||||||
for (int stage = 0; stage < 8; stage++)
|
for (int stage = 0; stage < 8; stage++)
|
||||||
D3D::SetSamplerState(stage, D3DSAMP_MAXANISOTROPY, g_ActiveConfig.iMaxAnisotropy);
|
D3D::SetSamplerState(stage, D3DSAMP_MAXANISOTROPY, g_ActiveConfig.iMaxAnisotropy);
|
||||||
|
|
||||||
|
D3D::dev->Clear(0, NULL, D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(255,255,255),1.0f,0);
|
||||||
D3D::dev->Clear(0, NULL, D3DCLEAR_TARGET, 0x0, 0, 0);
|
D3D::dev->Clear(0, NULL, D3DCLEAR_TARGET, 0x0, 0, 0);
|
||||||
|
|
||||||
D3D::dev->SetRenderTarget(0, FBManager::GetEFBColorRTSurface());
|
D3D::dev->SetRenderTarget(0, FBManager::GetEFBColorRTSurface());
|
||||||
@ -465,7 +466,31 @@ u32 Renderer::AccessEFB(EFBAccessType type, int x, int y)
|
|||||||
int srcY = (targetPixelRc.top + targetPixelRc.bottom) / 2;
|
int srcY = (targetPixelRc.top + targetPixelRc.bottom) / 2;
|
||||||
|
|
||||||
u32 z = 0;
|
u32 z = 0;
|
||||||
// glReadPixels(srcX, srcY, 1, 1, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, &z);
|
float val = 0.0f;
|
||||||
|
|
||||||
|
LPDIRECT3DSURFACE9 pZBuffer = NULL;
|
||||||
|
if (D3D::dev->GetDepthStencilSurface(&pZBuffer) == D3DERR_NOTFOUND)
|
||||||
|
pZBuffer = NULL;
|
||||||
|
|
||||||
|
//D3DLOCKED_RECT drect;
|
||||||
|
//HRESULT hr;
|
||||||
|
|
||||||
|
if(!pZBuffer) {
|
||||||
|
PanicAlert("No Z-Buffer!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Fix
|
||||||
|
//if((hr = pZBuffer->LockRect(0, &drect, NULL, NULL)) != D3D_OK)
|
||||||
|
// PanicAlert("IT WAS AS I THOUGHT, %s", hr == D3DERR_WASSTILLDRAWING ? "Still drawing" :
|
||||||
|
// hr == D3DERR_INVALIDCALL ? "Invalid call" : "w00t");
|
||||||
|
|
||||||
|
//val = ((float *)drect.pBits)[0];
|
||||||
|
|
||||||
|
//pZBuffer->UnlockRect(0);
|
||||||
|
|
||||||
|
// [0.0, 1.0] ==> [0, 0xFFFFFFFF]
|
||||||
|
z = val * 0xFFFFFFFF;
|
||||||
|
|
||||||
// Scale the 32-bit value returned by glReadPixels to a 24-bit
|
// Scale the 32-bit value returned by glReadPixels to a 24-bit
|
||||||
// value (GC uses a 24-bit Z-buffer).
|
// value (GC uses a 24-bit Z-buffer).
|
||||||
|
@ -3213,7 +3213,7 @@ void 0919_Decoder0x6_Constant(AR0, AX0.L) {
|
|||||||
|
|
||||||
void 091c_Decoder0x7_WaveTable(ACC0, AR0, AX0.L) {
|
void 091c_Decoder0x7_WaveTable(ACC0, AR0, AX0.L) {
|
||||||
// So AR2 is where it reads the data from, and it updates ACC0 to the final read address in the end
|
// So AR2 is where it reads the data from, and it updates ACC0 to the final read address in the end
|
||||||
// Questions: What is IX2 used for? And how does the wrap register change the data access?
|
// Questions: How does the wrap register change the data access?
|
||||||
|
|
||||||
// 091c 0082 0100 lri $AR2, #0x0100
|
// 091c 0082 0100 lri $AR2, #0x0100
|
||||||
// 091e 008a 003f lri $WR2, #0x003f
|
// 091e 008a 003f lri $WR2, #0x003f
|
||||||
|
Loading…
Reference in New Issue
Block a user