diff --git a/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcproj b/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcproj index 75691d39a5..6c468402ba 100644 --- a/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcproj +++ b/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcproj @@ -739,11 +739,23 @@ + + + + + @@ -756,10 +768,18 @@ RelativePath=".\Src\VertexLoader_Normal.h" > + + + + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/BPStructs.cpp b/Source/Plugins/Plugin_VideoOGL/Src/BPStructs.cpp index 3a7ad113d3..5e5c39524c 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/BPStructs.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/BPStructs.cpp @@ -268,7 +268,7 @@ void BPWritten(int addr, int changes, int newval) } if (changes & 0x18) - SetColorMask(); + Renderer::SetColorMask(); } break; @@ -342,7 +342,7 @@ void BPWritten(int addr, int changes, int newval) if (changes) { VertexManager::Flush(); ((u32*)&bpmem)[addr] = newval; - SetScissorRect(); + Renderer::SetScissorRect(); } break; @@ -352,7 +352,7 @@ void BPWritten(int addr, int changes, int newval) if (changes) { VertexManager::Flush(); ((u32*)&bpmem)[addr] = newval; - if (!SetScissorRect()) { + if (!Renderer::SetScissorRect()) { if (addr == BPMEM_SCISSORBR ) ERROR_LOG("bad scissor!\n"); } @@ -447,7 +447,7 @@ void BPWritten(int addr, int changes, int newval) PE_copy.Hex = bpmem.triggerEFBCopy; if (PE_copy.copy_to_xfb == 0) { - if(g_Config.bEBFToTextureDisable) { + if(g_Config.bEFBToTextureDisable) { glViewport(rc.left,rc.bottom,rc.right,rc.top); glScissor(rc.left,rc.bottom,rc.right,rc.top); } @@ -521,7 +521,7 @@ void BPWritten(int addr, int changes, int newval) ((bpmem.clearZValue>>8)&0xff)*(1/255.0f), ((bpmem.clearZValue>>16)&0xff)*(1/255.0f), 0); glClear(GL_COLOR_BUFFER_BIT); - SetColorMask(); + Renderer::SetColorMask(); GL_REPORT_ERRORD(); } @@ -531,7 +531,7 @@ void BPWritten(int addr, int changes, int newval) glDrawBuffers(2, s_drawbuffers); } - SetScissorRect(); // reset the scissor rect + Renderer::SetScissorRect(); // reset the scissor rect } } break; @@ -732,70 +732,6 @@ void BPWritten(int addr, int changes, int newval) } } - -void SetColorMask() -{ - if (bpmem.blendmode.alphaupdate && bpmem.blendmode.colorupdate) - glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); - else if (bpmem.blendmode.alphaupdate) - glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE); - else if (bpmem.blendmode.colorupdate) - glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE); -} - - -// ======================================================================================= -// Call browser: OpcodeDecoding.cpp ExecuteDisplayList > Decode() > LoadBPReg() -// case 0x52 > SetScissorRect() -// --------------- -// This function handles the OpenGL glScissor() function -// --------------- -// bpmem.scissorTL.x, y = 342x342 -// bpmem.scissorBR.x, y = 981x821 -// Renderer::GetTargetHeight() = the fixed ini file setting -// --------------- -bool SetScissorRect() -{ - int xoff = bpmem.scissorOffset.x * 2 - 342; - int yoff = bpmem.scissorOffset.y * 2 - 342; - - float rc_left = bpmem.scissorTL.x - xoff - 342; // left = 0 - rc_left *= MValueX; - if (rc_left < 0) rc_left = 0; - - float rc_top = bpmem.scissorTL.y - yoff - 342; // right = 0 - rc_top *= MValueY; - if (rc_top < 0) rc_top = 0; - - float rc_right = bpmem.scissorBR.x - xoff - 342; // right = 640 - rc_right *= MValueX; - if (rc_right > 640 * MValueX) rc_right = 640 * MValueX; - - float rc_bottom = bpmem.scissorBR.y - yoff - 342; // bottom = 480 - rc_bottom *= MValueY; - if (rc_bottom > 480 * MValueY) rc_bottom = 480 * MValueY; - - /*__Log("Scissor: lt=(%d,%d), rb=(%d,%d,%i), off=(%d,%d)\n", - rc_left, rc_top, - rc_right, rc_bottom, Renderer::GetTargetHeight(), - xoff, yoff - );*/ - - if (rc_right >= rc_left && rc_bottom >= rc_top ) - { - glScissor( - (int)rc_left, // x = 0 - Renderer::GetTargetHeight()-(int)(rc_bottom), // y = 0 - (int)(rc_right-rc_left), // y = 0 - (int)(rc_bottom-rc_top) // y = 0 - ); - return true; - } - - return false; -} - - // Call browser: OpcodeDecoding.cpp ExecuteDisplayList > Decode() > LoadBPReg() void LoadBPReg(u32 value0) { diff --git a/Source/Plugins/Plugin_VideoOGL/Src/BPStructs.h b/Source/Plugins/Plugin_VideoOGL/Src/BPStructs.h index b56db6bec9..a4e9a8f2fb 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/BPStructs.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/BPStructs.h @@ -24,7 +24,4 @@ void BPInit(); void LoadBPReg(u32 value0); void BPReload(); -void SetColorMask(); -bool SetScissorRect(); - #endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp index 2242424170..81c7ed20e6 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp @@ -75,11 +75,10 @@ void Config::Load() iniFile.Get("Settings", "DisableTexturing", &bDisableTexturing, 0); iniFile.Get("Enhancements", "ForceFiltering", &bForceFiltering, 0); - iniFile.Get("Enhancements", "ForceMaxAniso", &bForceMaxAniso, 0); + iniFile.Get("Enhancements", "MaxAnisotropy", &iMaxAnisotropy, 3); // NOTE - this is x in (1 << x) - - iniFile.Get("Hacks", "EFBToTextureDisable", &bEBFToTextureDisable, 0); - iniFile.Get("Hacks", "EBFToTextureDisableHotKey", &bEBFToTextureDisableHotKey, 0); + iniFile.Get("Hacks", "EFBToTextureDisable", &bEFBToTextureDisable, 0); + iniFile.Get("Hacks", "EFBToTextureDisableHotKey", &bEFBToTextureDisableHotKey, 0); iniFile.Get("Hacks", "ProjectionHax1", &bProjectionHax1, 0); iniFile.Get("Hacks", "ProjectionHax2", &bProjectionHax2, 0); } @@ -112,10 +111,10 @@ void Config::Save() iniFile.Set("Settings", "DisableTexturing", bDisableTexturing); iniFile.Set("Enhancements", "ForceFiltering", bForceFiltering); - iniFile.Set("Enhancements", "ForceMaxAniso", bForceMaxAniso); + iniFile.Set("Enhancements", "MaxAnisotropy", iMaxAnisotropy); - iniFile.Set("Hacks", "EFBToTextureDisable", bEBFToTextureDisable); - iniFile.Set("Hacks", "EBFToTextureDisableHotKey", bEBFToTextureDisableHotKey); + iniFile.Set("Hacks", "EFBToTextureDisable", bEFBToTextureDisable); + iniFile.Set("Hacks", "EFBToTextureDisableHotKey", bEFBToTextureDisableHotKey); iniFile.Set("Hacks", "ProjectionHax1", bProjectionHax1); iniFile.Set("Hacks", "ProjectionHax2", bProjectionHax2); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Config.h b/Source/Plugins/Plugin_VideoOGL/Src/Config.h index d5a000b4c6..5e56626c0f 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Config.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/Config.h @@ -44,7 +44,7 @@ struct Config // Enhancements int iMultisampleMode; bool bForceFiltering; - bool bForceMaxAniso; + int iMaxAnisotropy; // Information bool bShowFPS; @@ -63,7 +63,8 @@ struct Config bool bDumpTextures; // Hacks - bool bEBFToTextureDisable; bool bEBFToTextureDisableHotKey; + bool bEFBToTextureDisable; + bool bEFBToTextureDisableHotKey; bool bProjectionHax1; bool bProjectionHax2; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp index 84add16651..4f3d7fbeb8 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp @@ -31,8 +31,8 @@ BEGIN_EVENT_TABLE(ConfigDialog,wxDialog) EVT_COMBOBOX(ID_FULLSCREENCB, ConfigDialog::GeneralSettingsChanged) EVT_COMBOBOX(ID_WINDOWRESOLUTIONCB, ConfigDialog::GeneralSettingsChanged) EVT_COMBOBOX(ID_ALIASMODECB, ConfigDialog::GeneralSettingsChanged) + EVT_CHOICE(ID_MAXANISOTROPY, ConfigDialog::GeneralSettingsChanged) EVT_CHECKBOX(ID_FORCEFILTERING, ConfigDialog::GeneralSettingsChanged) - EVT_CHECKBOX(ID_FORCEANISOTROPY, ConfigDialog::GeneralSettingsChanged) EVT_CHECKBOX(ID_STRETCHTOFIT, ConfigDialog::GeneralSettingsChanged) EVT_CHECKBOX(ID_KEEPAR, ConfigDialog::GeneralSettingsChanged) EVT_CHECKBOX(ID_HIDECURSOR, ConfigDialog::GeneralSettingsChanged) @@ -121,14 +121,20 @@ void ConfigDialog::CreateGUIControls() sbEnhancements = new wxStaticBoxSizer(wxVERTICAL, m_PageGeneral, wxT("Enhancements")); m_ForceFiltering = new wxCheckBox(m_PageGeneral, ID_FORCEFILTERING, wxT("Force bi/trilinear filtering (May cause small glitches)"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_ForceFiltering->SetValue(g_Config.bForceFiltering); - m_ForceAnisotropy = new wxCheckBox(m_PageGeneral, ID_FORCEANISOTROPY, wxT("Force maximum anisotropy filtering"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); - //m_ForceAnisotropy->SetValue(g_Config.bForceMaxAniso); - m_ForceAnisotropy->Enable(false); + wxStaticText *AnisoText = new wxStaticText(m_PageGeneral, ID_WMTEXT, wxT("Anisotropic filter:"), wxDefaultPosition, wxDefaultSize, 0); + m_MaxAnisotropyCB = new wxChoice(m_PageGeneral, ID_MAXANISOTROPY, wxDefaultPosition, wxDefaultSize, arrayStringFor_MaxAnisotropyCB, 0, wxDefaultValidator); + m_MaxAnisotropyCB->Append("1x"); + m_MaxAnisotropyCB->Append("2x"); + m_MaxAnisotropyCB->Append("4x"); + m_MaxAnisotropyCB->Append("8x"); + m_MaxAnisotropyCB->Append("16x"); + m_MaxAnisotropyCB->SetSelection(g_Config.iMaxAnisotropy - 1); + wxStaticText *AAText = new wxStaticText(m_PageGeneral, ID_AATEXT, wxT("Anti-alias mode:"), wxDefaultPosition, wxDefaultSize, 0); wxArrayString arrayStringFor_AliasModeCB; m_AliasModeCB = new wxComboBox(m_PageGeneral, ID_ALIASMODECB, wxEmptyString, wxDefaultPosition, wxDefaultSize, arrayStringFor_AliasModeCB, 0, wxDefaultValidator); wxString tmp; - tmp<SetValue(tmp); // Usage: The wxGBPosition() must have a column and row @@ -148,7 +154,8 @@ void ConfigDialog::CreateGUIControls() sEnhancements = new wxGridBagSizer(0, 0); sEnhancements->Add(m_ForceFiltering, wxGBPosition(0, 0), wxGBSpan(1, 2), wxALL, 5); - sEnhancements->Add(m_ForceAnisotropy, wxGBPosition(1, 0), wxGBSpan(1, 2), wxALL, 5); + sEnhancements->Add(AnisoText, wxGBPosition(1, 0), wxGBSpan(1, 1), wxALIGN_CENTER_VERTICAL|wxALL, 5); + sEnhancements->Add(m_MaxAnisotropyCB, wxGBPosition(1, 1), wxGBSpan(1, 2), wxALL, 5); sEnhancements->Add(AAText, wxGBPosition(2, 0), wxGBSpan(1, 1), wxALIGN_CENTER_VERTICAL|wxALL, 5); sEnhancements->Add(m_AliasModeCB, wxGBPosition(2, 1), wxGBSpan(1, 2), wxALL, 5); sbEnhancements->Add(sEnhancements); @@ -200,7 +207,7 @@ void ConfigDialog::CreateGUIControls() m_EFBToTextureDisable->SetToolTip(wxT("Do not copy the Embedded Framebuffer (EFB)" " to the\nTexture. This may result in a speed increase.")); m_EFBToTextureDisable->Enable(true); - m_EFBToTextureDisable->SetValue(g_Config.bEBFToTextureDisable); + m_EFBToTextureDisable->SetValue(g_Config.bEFBToTextureDisable); m_EFBToTextureDisableHotKey = new wxCheckBox(m_PageAdvanced, ID_EFBTOTEXTUREDISABLEHOTKEY, wxT("with hotkey E"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_EFBToTextureDisableHotKey->SetToolTip(wxT("Use the E key to turn this option on and off")); @@ -208,7 +215,7 @@ void ConfigDialog::CreateGUIControls() // JPeterson set the hot key to be Win32-specific m_EFBToTextureDisableHotKey->Enable(false); #endif - m_EFBToTextureDisableHotKey->SetValue(g_Config.bEBFToTextureDisableHotKey); + m_EFBToTextureDisableHotKey->SetValue(g_Config.bEFBToTextureDisableHotKey); m_SafeTextureCache = new wxCheckBox(m_PageAdvanced, ID_SAFETEXTURECACHE, wxT("Safe texture cache"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_SafeTextureCache->SetToolTip(wxT("This is useful to prevent Metroid Prime from crashing, but can cause problems in other games.")); @@ -330,8 +337,8 @@ void ConfigDialog::GeneralSettingsChanged(wxCommandEvent& event) case ID_FORCEFILTERING: g_Config.bForceFiltering = m_ForceFiltering->IsChecked(); break; - case ID_FORCEANISOTROPY: - g_Config.bForceMaxAniso = m_ForceAnisotropy->IsChecked(); + case ID_MAXANISOTROPY: + g_Config.iMaxAnisotropy = m_MaxAnisotropyCB->GetSelection() + 1; break; case ID_ALIASMODECB: g_Config.iMultisampleMode = atoi(m_AliasModeCB->GetValue().mb_str()); @@ -380,10 +387,10 @@ void ConfigDialog::AdvancedSettingsChanged(wxCommandEvent& event) case ID_TEXTUREPATH: break; case ID_EFBTOTEXTUREDISABLE: - g_Config.bEBFToTextureDisable = m_EFBToTextureDisable->IsChecked(); + g_Config.bEFBToTextureDisable = m_EFBToTextureDisable->IsChecked(); break; case ID_EFBTOTEXTUREDISABLEHOTKEY: - g_Config.bEBFToTextureDisableHotKey = m_EFBToTextureDisableHotKey->IsChecked(); + g_Config.bEFBToTextureDisableHotKey = m_EFBToTextureDisableHotKey->IsChecked(); break; case ID_PROJECTIONHACK1: g_Config.bProjectionHax1 = m_ProjectionHax1->IsChecked(); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h index af029e727d..84c6c5f944 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -80,7 +81,8 @@ class ConfigDialog : public wxDialog wxComboBox *m_WindowResolutionCB; wxCheckBox *m_ForceFiltering; // advanced - wxCheckBox *m_ForceAnisotropy; + wxChoice *m_MaxAnisotropyCB; + wxArrayString arrayStringFor_MaxAnisotropyCB; wxComboBox *m_AliasModeCB; wxCheckBox *m_ShowFPS; wxCheckBox *m_ShaderErrors; @@ -118,7 +120,7 @@ class ConfigDialog : public wxDialog ID_WINDOWRESOLUTIONCB, ID_FORCEFILTERING, - ID_FORCEANISOTROPY, + ID_MAXANISOTROPY, ID_AATEXT, ID_ALIASMODECB, diff --git a/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp b/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp index b656d5a3f4..61cd5c9f7c 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp @@ -138,11 +138,11 @@ namespace EmuWindow hypotheticalScene->sendMessage(KEYDOWN...); */ case 'E': // EFB hotkey - if(g_Config.bEBFToTextureDisableHotKey) + if(g_Config.bEFBToTextureDisableHotKey) { - g_Config.bEBFToTextureDisable = !g_Config.bEBFToTextureDisable; + g_Config.bEFBToTextureDisable = !g_Config.bEFBToTextureDisable; Renderer::AddMessage(StringFromFormat("Copy EFB was turned %s", - g_Config.bEBFToTextureDisable ? "off" : "on").c_str(), 5000); + g_Config.bEFBToTextureDisable ? "off" : "on").c_str(), 5000); } break; } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index bc437f227f..08303a19f3 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -561,6 +561,69 @@ void Renderer::RestoreGLState() SetColorMask(); } +void Renderer::SetColorMask() +{ + if (bpmem.blendmode.alphaupdate && bpmem.blendmode.colorupdate) + glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); + else if (bpmem.blendmode.alphaupdate) + glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE); + else if (bpmem.blendmode.colorupdate) + glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE); +} + + +// ======================================================================================= +// Call browser: OpcodeDecoding.cpp ExecuteDisplayList > Decode() > LoadBPReg() +// case 0x52 > SetScissorRect() +// --------------- +// This function handles the OpenGL glScissor() function +// --------------- +// bpmem.scissorTL.x, y = 342x342 +// bpmem.scissorBR.x, y = 981x821 +// Renderer::GetTargetHeight() = the fixed ini file setting +// --------------- +bool Renderer::SetScissorRect() +{ + int xoff = bpmem.scissorOffset.x * 2 - 342; + int yoff = bpmem.scissorOffset.y * 2 - 342; + + float rc_left = bpmem.scissorTL.x - xoff - 342; // left = 0 + rc_left *= MValueX; + if (rc_left < 0) rc_left = 0; + + float rc_top = bpmem.scissorTL.y - yoff - 342; // right = 0 + rc_top *= MValueY; + if (rc_top < 0) rc_top = 0; + + float rc_right = bpmem.scissorBR.x - xoff - 342; // right = 640 + rc_right *= MValueX; + if (rc_right > 640 * MValueX) rc_right = 640 * MValueX; + + float rc_bottom = bpmem.scissorBR.y - yoff - 342; // bottom = 480 + rc_bottom *= MValueY; + if (rc_bottom > 480 * MValueY) rc_bottom = 480 * MValueY; + + /*__Log("Scissor: lt=(%d,%d), rb=(%d,%d,%i), off=(%d,%d)\n", + rc_left, rc_top, + rc_right, rc_bottom, Renderer::GetTargetHeight(), + xoff, yoff + );*/ + + if (rc_right >= rc_left && rc_bottom >= rc_top ) + { + glScissor( + (int)rc_left, // x = 0 + Renderer::GetTargetHeight()-(int)(rc_bottom), // y = 0 + (int)(rc_right-rc_left), // y = 0 + (int)(rc_bottom-rc_top) // y = 0 + ); + return true; + } + + return false; +} + + bool Renderer::IsUsingATIDrawBuffers() { return s_bATIDrawBuffers; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.h b/Source/Plugins/Plugin_VideoOGL/Src/Render.h index 314606b05e..c5c88eb5f5 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.h @@ -68,6 +68,9 @@ public: static void SetZBufferRender(); // sets rendering of the zbuffer using MRTs static u32 GetZBufferTarget(); + static void SetColorMask(); + static bool SetScissorRect(); + static void SetRenderMode(RenderMode mode); static RenderMode GetRenderMode(); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp b/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp index 0062c3203a..4826ff3d8b 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp @@ -148,10 +148,10 @@ void EncodeToRam(GLuint srcTexture, const TRectangle& sourceRc, glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, s_rgbToYuyvProgram.glprogid); glBegin(GL_QUADS); - glTexCoord2f(sourceRc.left, sourceRc.top); glVertex2f(-1,-1); - glTexCoord2f(sourceRc.left, sourceRc.bottom); glVertex2f(-1,1); - glTexCoord2f(sourceRc.right, sourceRc.bottom); glVertex2f(1,1); - glTexCoord2f(sourceRc.right, sourceRc.top); glVertex2f(1,-1); + glTexCoord2f((float)sourceRc.left, (float)sourceRc.top); glVertex2f(-1,-1); + glTexCoord2f((float)sourceRc.left, (float)sourceRc.bottom); glVertex2f(-1,1); + glTexCoord2f((float)sourceRc.right, (float)sourceRc.bottom); glVertex2f(1,1); + glTexCoord2f((float)sourceRc.right, (float)sourceRc.top); glVertex2f(1,-1); glEnd(); GL_REPORT_ERRORD(); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.cpp b/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.cpp index b2bee4b544..ecd3c99800 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.cpp @@ -100,9 +100,9 @@ void TextureMngr::TCacheEntry::SetTextureParameters(TexMode0 &newmode) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, c_WrapSettings[newmode.wrap_t]); } - if (g_Config.bForceMaxAniso) + if (g_Config.iMaxAnisotropy >= 1) { - // not used for now, check out GL_EXT_texture_filter_anisotropic + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1 << g_Config.iMaxAnisotropy); } } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader.cpp b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader.cpp index 80ea83121c..7961bf165e 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader.cpp @@ -27,25 +27,28 @@ #include "x64Emitter.h" #include "ABI.h" +#include "LookUpTables.h" #include "Statistics.h" #include "VertexManager.h" #include "VertexLoaderManager.h" +#include "VertexShaderManager.h" +#include "VertexManager.h" #include "VertexLoader.h" #include "BPStructs.h" #include "DataReader.h" +#include "VertexLoader_Position.h" +#include "VertexLoader_Normal.h" +#include "VertexLoader_Color.h" +#include "VertexLoader_TextCoord.h" + #define USE_JIT +#define COMPILED_CODE_SIZE 4096*4 + NativeVertexFormat *g_nativeVertexFmt; - //these don't need to be saved -static float posScale; -static int colElements[2]; -static float tcScaleU[8]; -static float tcScaleV[8]; -static int tcIndex; -static int colIndex; #ifndef _WIN32 #undef inline #define inline @@ -57,9 +60,16 @@ static u8 s_curposmtx; static u8 s_curtexmtx[8]; static int s_texmtxwrite = 0; static int s_texmtxread = 0; -static TVtxAttr* pVtxAttr; static int loop_counter; +// Vertex loaders read these. Although the scale ones should be baked into the shader. +int tcIndex; +int colIndex; +TVtxAttr* pVtxAttr; +int colElements[2]; +float posScale; +float tcScale[8]; + using namespace Gen; void LOADERDECL PosMtx_ReadDirect_UByte() @@ -104,13 +114,6 @@ void LOADERDECL TexMtx_Write_Short3() VertexManager::s_pCurBufferPointer += 8; } -#include "VertexLoader_Position.h" -#include "VertexLoader_Normal.h" -#include "VertexLoader_Color.h" -#include "VertexLoader_TextCoord.h" - -#define COMPILED_CODE_SIZE 4096*4 - VertexLoader::VertexLoader(const TVtxDesc &vtx_desc, const VAT &vtx_attr) { m_numLoadedVertices = 0; @@ -628,10 +631,8 @@ void VertexLoader::RunVertices(int vtx_attr_group, int primitive, int count) pVtxAttr = &m_VtxAttr; posScale = shiftLookup[m_VtxAttr.PosFrac]; if (m_NativeFmt->m_components & VB_HAS_UVALL) { - for (int i = 0; i < 8; i++) { - tcScaleU[i] = shiftLookup[m_VtxAttr.texCoord[i].Frac]; - tcScaleV[i] = shiftLookup[m_VtxAttr.texCoord[i].Frac]; - } + for (int i = 0; i < 8; i++) + tcScale[i] = shiftLookup[m_VtxAttr.texCoord[i].Frac]; } for (int i = 0; i < 2; i++) colElements[i] = m_VtxAttr.color[i].Elements; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_Color.cpp b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_Color.cpp new file mode 100644 index 0000000000..13b3c3fbce --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_Color.cpp @@ -0,0 +1,231 @@ +// Copyright (C) 2003-2008 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 _VERTEXLOADERCOLOR_H +#define _VERTEXLOADERCOLOR_H + +#include "Globals.h" +#include "LookUpTables.h" +#include "VertexLoader.h" +#include "VertexManager.h" +#include "VertexLoader_Color.h" + +#define RSHIFT 0 +#define GSHIFT 8 +#define BSHIFT 16 +#define ASHIFT 24 + +extern int colIndex; +extern int colElements[2]; + +inline void _SetCol(u32 val) +{ + *(u32*)VertexManager::s_pCurBufferPointer = val; + VertexManager::s_pCurBufferPointer += 4; + colIndex++; +} + +void _SetCol4444(u16 val) +{ + u32 col = lut4to8[(val>>0)&0xF]<>12)&0xF] <>8)&0xF] <>4)&0xF] <>18)&0x3F] << RSHIFT; + col |= lut6to8[(val>>12)&0x3F] << GSHIFT; + col |= lut6to8[(val>>6)&0x3F] << BSHIFT; + col |= lut6to8[(val>>0)&0x3F] << ASHIFT; + _SetCol(col); +} + +void _SetCol565(u16 val) +{ + u32 col = lut5to8[(val>>11)&0x1f] << RSHIFT; + col |= lut6to8[(val>>5 )&0x3f] << GSHIFT; + col |= lut5to8[(val )&0x1f] << BSHIFT; + _SetCol(col | (0xFF<>0)&0xF]<>12)&0xF] <>8)&0xF] <>4)&0xF] <>18)&0x3F] << RSHIFT; - col |= lut6to8[(val>>12)&0x3F] << GSHIFT; - col |= lut6to8[(val>>6)&0x3F] << BSHIFT; - col |= lut6to8[(val>>0)&0x3F] << ASHIFT; - _SetCol(col); -} - -void _SetCol565(u16 val) -{ - u32 col = lut5to8[(val>>11)&0x1f] << RSHIFT; - col |= lut6to8[(val>>5 )&0x3f] << GSHIFT; - col |= lut5to8[(val )&0x1f] << BSHIFT; - _SetCol(col | (0xFF< +MULPS(XMM0, XMM7); +MOVUPS(MOffset(EDI, 0), XMM0); + + */ + +// ============================================================================== +// Direct +// ============================================================================== +void LOADERDECL Pos_ReadDirect_UByte() +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU8() * posScale; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU8() * posScale; + if (pVtxAttr->PosElements) + ((float*)VertexManager::s_pCurBufferPointer)[2] = (float)DataReadU8() * posScale; + else + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; + LOG_VTX(); + VertexManager::s_pCurBufferPointer += 12; +} + +void LOADERDECL Pos_ReadDirect_Byte() +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)DataReadU8() * posScale; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)DataReadU8() * posScale; + if (pVtxAttr->PosElements) + ((float*)VertexManager::s_pCurBufferPointer)[2] = (float)(s8)DataReadU8() * posScale; + else + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0; + LOG_VTX(); + VertexManager::s_pCurBufferPointer += 12; +} + +void LOADERDECL Pos_ReadDirect_UShort() +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU16() * posScale; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU16() * posScale; + if (pVtxAttr->PosElements) + ((float*)VertexManager::s_pCurBufferPointer)[2] = (float)DataReadU16() * posScale; + else + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; + LOG_VTX(); + VertexManager::s_pCurBufferPointer += 12; +} + +void LOADERDECL Pos_ReadDirect_Short() +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)DataReadU16() * posScale; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)DataReadU16() * posScale; + if (pVtxAttr->PosElements) + ((float*)VertexManager::s_pCurBufferPointer)[2] = (float)(s16)DataReadU16() * posScale; + else + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; + LOG_VTX(); + VertexManager::s_pCurBufferPointer += 12; +} + +void LOADERDECL Pos_ReadDirect_Float() +{ + // No need to use floating point here. + ((u32 *)VertexManager::s_pCurBufferPointer)[0] = DataReadU32(); + ((u32 *)VertexManager::s_pCurBufferPointer)[1] = DataReadU32(); + if (pVtxAttr->PosElements) + ((u32 *)VertexManager::s_pCurBufferPointer)[2] = DataReadU32(); + else + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; + LOG_VTX(); + VertexManager::s_pCurBufferPointer += 12; +} + +#define Pos_ReadIndex_Byte(T) { \ + u32 iAddress = arraybases[ARRAY_POSITION] + ((u32)Index * arraystrides[ARRAY_POSITION]); \ + ((float*)VertexManager::s_pCurBufferPointer)[0] = ((float)(T)Memory_Read_U8(iAddress)) * posScale; \ + ((float*)VertexManager::s_pCurBufferPointer)[1] = ((float)(T)Memory_Read_U8(iAddress+1)) * posScale; \ + if (pVtxAttr->PosElements) \ + ((float*)VertexManager::s_pCurBufferPointer)[2] = ((float)(T)Memory_Read_U8(iAddress+2)) * posScale; \ + else \ + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \ + LOG_VTX(); \ + VertexManager::s_pCurBufferPointer += 12; \ +} + +#define Pos_ReadIndex_Short(T) { \ + u32 iAddress = arraybases[ARRAY_POSITION] + ((u32)Index * arraystrides[ARRAY_POSITION]); \ + ((float*)VertexManager::s_pCurBufferPointer)[0] = ((float)(T)Memory_Read_U16(iAddress)) * posScale; \ + ((float*)VertexManager::s_pCurBufferPointer)[1] = ((float)(T)Memory_Read_U16(iAddress+2)) * posScale; \ + if (pVtxAttr->PosElements) \ + ((float*)VertexManager::s_pCurBufferPointer)[2] = ((float)(T)Memory_Read_U16(iAddress+4)) * posScale; \ + else \ + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \ + LOG_VTX(); \ + VertexManager::s_pCurBufferPointer += 12; \ +} + +#define Pos_ReadIndex_Float() { \ + u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); \ + ((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress); \ + ((u32*)VertexManager::s_pCurBufferPointer)[1] = Memory_Read_U32(iAddress+4); \ + if (pVtxAttr->PosElements) \ + ((u32*)VertexManager::s_pCurBufferPointer)[2] = Memory_Read_U32(iAddress+8); \ + else \ + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \ + LOG_VTX(); \ + VertexManager::s_pCurBufferPointer += 12; \ +} + +// ============================================================================== +// Index 8 +// ============================================================================== +void LOADERDECL Pos_ReadIndex8_UByte() +{ + u8 Index = DataReadU8(); + Pos_ReadIndex_Byte(u8); +} + +void LOADERDECL Pos_ReadIndex8_Byte() +{ + u8 Index = DataReadU8(); + Pos_ReadIndex_Byte(s8); +} + +void LOADERDECL Pos_ReadIndex8_UShort() +{ + u8 Index = DataReadU8(); + Pos_ReadIndex_Short(u16); +} + +void LOADERDECL Pos_ReadIndex8_Short() +{ + u8 Index = DataReadU8(); + Pos_ReadIndex_Short(s16); +} + +void LOADERDECL Pos_ReadIndex8_Float() +{ + u8 Index = DataReadU8(); + Pos_ReadIndex_Float(); +} + +// ============================================================================== +// Index 16 +// ============================================================================== + +void LOADERDECL Pos_ReadIndex16_UByte(){ + u16 Index = DataReadU16(); + Pos_ReadIndex_Byte(u8); +} + +void LOADERDECL Pos_ReadIndex16_Byte(){ + u16 Index = DataReadU16(); + Pos_ReadIndex_Byte(s8); +} + +void LOADERDECL Pos_ReadIndex16_UShort(){ + u16 Index = DataReadU16(); + Pos_ReadIndex_Short(u16); +} + +void LOADERDECL Pos_ReadIndex16_Short() +{ + u16 Index = DataReadU16(); + Pos_ReadIndex_Short(s16); +} + +void LOADERDECL Pos_ReadIndex16_Float() +{ + u16 Index = DataReadU16(); + Pos_ReadIndex_Float(); +} + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_Position.h b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_Position.h index 43991b8eed..31afccb4b3 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_Position.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_Position.h @@ -18,216 +18,22 @@ #ifndef VERTEXLOADER_POSITION_H #define VERTEXLOADER_POSITION_H -#define LOG_VTX() PRIM_LOG("vtx: %f %f %f, ", ((float*)VertexManager::s_pCurBufferPointer)[0], ((float*)VertexManager::s_pCurBufferPointer)[1], ((float*)VertexManager::s_pCurBufferPointer)[2]); +void LOADERDECL Pos_ReadDirect_UByte(); +void LOADERDECL Pos_ReadDirect_Byte(); +void LOADERDECL Pos_ReadDirect_UShort(); +void LOADERDECL Pos_ReadDirect_Short(); +void LOADERDECL Pos_ReadDirect_Float(); -// Thoughts on the implementation of a vertex loader compiler. -// s_pCurBufferPointer should definitely be in a register. -// Could load the position scale factor in XMM7, for example. +void LOADERDECL Pos_ReadIndex8_UByte(); +void LOADERDECL Pos_ReadIndex8_Byte(); +void LOADERDECL Pos_ReadIndex8_UShort(); +void LOADERDECL Pos_ReadIndex8_Short(); +void LOADERDECL Pos_ReadIndex8_Float(); -// The pointer inside DataReadU8 in another. -// Let's check out Pos_ReadDirect_UByte(). For Byte, replace MOVZX with MOVSX. - -/* -MOVZX(32, R(EAX), MOffset(ESI, 0)); -MOVZX(32, R(EBX), MOffset(ESI, 1)); -MOVZX(32, R(ECX), MOffset(ESI, 2)); -MOVD(XMM0, R(EAX)); -MOVD(XMM1, R(EBX)); -MOVD(XMM2, R(ECX)); -CVTDQ2PS(XMM0, XMM0); -CVTDQ2PS(XMM1, XMM1); -CVTDQ2PS(XMM2, XMM2); -MULSS(XMM0, XMM7); -MULSS(XMM1, XMM7); -MULSS(XMM2, XMM7); -MOVSS(MOffset(EDI, 0), XMM0); -MOVSS(MOffset(EDI, 4), XMM1); -MOVSS(MOffset(EDI, 8), XMM2); - -Alternatively, lookup table: -MOVZX(32, R(EAX), MOffset(ESI, 0)); -MOVZX(32, R(EBX), MOffset(ESI, 1)); -MOVZX(32, R(ECX), MOffset(ESI, 2)); -MOV(32, R(EAX), MComplex(LUTREG, EAX, 4)); -MOV(32, R(EBX), MComplex(LUTREG, EBX, 4)); -MOV(32, R(ECX), MComplex(LUTREG, ECX, 4)); -MOV(MOffset(EDI, 0), XMM0); -MOV(MOffset(EDI, 4), XMM1); -MOV(MOffset(EDI, 8), XMM2); - -SSE4: -PINSRB(XMM0, MOffset(ESI, 0), 0); -PINSRB(XMM0, MOffset(ESI, 1), 4); -PINSRB(XMM0, MOffset(ESI, 2), 8); -CVTDQ2PS(XMM0, XMM0); - -MULPS(XMM0, XMM7); -MOVUPS(MOffset(EDI, 0), XMM0); - - */ - -// ============================================================================== -// Direct -// ============================================================================== -void LOADERDECL Pos_ReadDirect_UByte() -{ - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU8() * posScale; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU8() * posScale; - if (pVtxAttr->PosElements) - ((float*)VertexManager::s_pCurBufferPointer)[2] = (float)DataReadU8() * posScale; - else - ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; - LOG_VTX(); - VertexManager::s_pCurBufferPointer += 12; -} - -void LOADERDECL Pos_ReadDirect_Byte() -{ - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)DataReadU8() * posScale; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)DataReadU8() * posScale; - if (pVtxAttr->PosElements) - ((float*)VertexManager::s_pCurBufferPointer)[2] = (float)(s8)DataReadU8() * posScale; - else - ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0; - LOG_VTX(); - VertexManager::s_pCurBufferPointer += 12; -} - -void LOADERDECL Pos_ReadDirect_UShort() -{ - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU16() * posScale; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU16() * posScale; - if (pVtxAttr->PosElements) - ((float*)VertexManager::s_pCurBufferPointer)[2] = (float)DataReadU16() * posScale; - else - ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; - LOG_VTX(); - VertexManager::s_pCurBufferPointer += 12; -} - -void LOADERDECL Pos_ReadDirect_Short() -{ - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)DataReadU16() * posScale; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)DataReadU16() * posScale; - if (pVtxAttr->PosElements) - ((float*)VertexManager::s_pCurBufferPointer)[2] = (float)(s16)DataReadU16() * posScale; - else - ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; - LOG_VTX(); - VertexManager::s_pCurBufferPointer += 12; -} - -void LOADERDECL Pos_ReadDirect_Float() -{ - // No need to use floating point here. - ((u32 *)VertexManager::s_pCurBufferPointer)[0] = DataReadU32(); - ((u32 *)VertexManager::s_pCurBufferPointer)[1] = DataReadU32(); - if (pVtxAttr->PosElements) - ((u32 *)VertexManager::s_pCurBufferPointer)[2] = DataReadU32(); - else - ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; - LOG_VTX(); - VertexManager::s_pCurBufferPointer += 12; -} - -#define Pos_ReadIndex_Byte(T) { \ - u32 iAddress = arraybases[ARRAY_POSITION] + ((u32)Index * arraystrides[ARRAY_POSITION]); \ - ((float*)VertexManager::s_pCurBufferPointer)[0] = ((float)(T)Memory_Read_U8(iAddress)) * posScale; \ - ((float*)VertexManager::s_pCurBufferPointer)[1] = ((float)(T)Memory_Read_U8(iAddress+1)) * posScale; \ - if (pVtxAttr->PosElements) \ - ((float*)VertexManager::s_pCurBufferPointer)[2] = ((float)(T)Memory_Read_U8(iAddress+2)) * posScale; \ - else \ - ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \ - LOG_VTX(); \ - VertexManager::s_pCurBufferPointer += 12; \ -} - -#define Pos_ReadIndex_Short(T) { \ - u32 iAddress = arraybases[ARRAY_POSITION] + ((u32)Index * arraystrides[ARRAY_POSITION]); \ - ((float*)VertexManager::s_pCurBufferPointer)[0] = ((float)(T)Memory_Read_U16(iAddress)) * posScale; \ - ((float*)VertexManager::s_pCurBufferPointer)[1] = ((float)(T)Memory_Read_U16(iAddress+2)) * posScale; \ - if (pVtxAttr->PosElements) \ - ((float*)VertexManager::s_pCurBufferPointer)[2] = ((float)(T)Memory_Read_U16(iAddress+4)) * posScale; \ - else \ - ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \ - LOG_VTX(); \ - VertexManager::s_pCurBufferPointer += 12; \ -} - -#define Pos_ReadIndex_Float() { \ - u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); \ - ((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress); \ - ((u32*)VertexManager::s_pCurBufferPointer)[1] = Memory_Read_U32(iAddress+4); \ - if (pVtxAttr->PosElements) \ - ((u32*)VertexManager::s_pCurBufferPointer)[2] = Memory_Read_U32(iAddress+8); \ - else \ - ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \ - LOG_VTX(); \ - VertexManager::s_pCurBufferPointer += 12; \ -} - -// ============================================================================== -// Index 8 -// ============================================================================== -void LOADERDECL Pos_ReadIndex8_UByte() -{ - u8 Index = DataReadU8(); - Pos_ReadIndex_Byte(u8); -} - -void LOADERDECL Pos_ReadIndex8_Byte() -{ - u8 Index = DataReadU8(); - Pos_ReadIndex_Byte(s8); -} - -void LOADERDECL Pos_ReadIndex8_UShort() -{ - u8 Index = DataReadU8(); - Pos_ReadIndex_Short(u16); -} - -void LOADERDECL Pos_ReadIndex8_Short() -{ - u8 Index = DataReadU8(); - Pos_ReadIndex_Short(s16); -} - -void LOADERDECL Pos_ReadIndex8_Float() -{ - u8 Index = DataReadU8(); - Pos_ReadIndex_Float(); -} - -// ============================================================================== -// Index 16 -// ============================================================================== - -void LOADERDECL Pos_ReadIndex16_UByte(){ - u16 Index = DataReadU16(); - Pos_ReadIndex_Byte(u8); -} - -void LOADERDECL Pos_ReadIndex16_Byte(){ - u16 Index = DataReadU16(); - Pos_ReadIndex_Byte(s8); -} - -void LOADERDECL Pos_ReadIndex16_UShort(){ - u16 Index = DataReadU16(); - Pos_ReadIndex_Short(u16); -} - -void LOADERDECL Pos_ReadIndex16_Short() -{ - u16 Index = DataReadU16(); - Pos_ReadIndex_Short(s16); -} - -void LOADERDECL Pos_ReadIndex16_Float() -{ - u16 Index = DataReadU16(); - Pos_ReadIndex_Float(); -} +void LOADERDECL Pos_ReadIndex16_UByte(); +void LOADERDECL Pos_ReadIndex16_Byte(); +void LOADERDECL Pos_ReadIndex16_UShort(); +void LOADERDECL Pos_ReadIndex16_Short(); +void LOADERDECL Pos_ReadIndex16_Float(); #endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_TextCoord.cpp b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_TextCoord.cpp new file mode 100644 index 0000000000..bc0125bcc6 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_TextCoord.cpp @@ -0,0 +1,337 @@ +// Copyright (C) 2003-2008 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_TEXCOORD_H +#define VERTEXLOADER_TEXCOORD_H + +#include "Globals.h" +#include "VertexLoader.h" +#include "VertexManager.h" +#include "VertexLoader_Position.h" + +#define LOG_TEX1() PRIM_LOG("tex: %f, ", ((float*)VertexManager::s_pCurBufferPointer)[0]); +#define LOG_TEX2() PRIM_LOG("tex: %f %f, ", ((float*)VertexManager::s_pCurBufferPointer)[0], ((float*)VertexManager::s_pCurBufferPointer)[1]); + +extern int tcIndex; +extern float tcScale[8]; + +void LOADERDECL TexCoord_Read_Dummy() +{ + tcIndex++; +} + +void LOADERDECL TexCoord_ReadDirect_UByte1() +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU8() * tcScale[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadDirect_UByte2() +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU8() * tcScale[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU8() * tcScale[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadDirect_Byte1() +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)DataReadU8() * tcScale[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadDirect_Byte2() +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)DataReadU8() * tcScale[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)DataReadU8() * tcScale[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadDirect_UShort1() +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU16() * tcScale[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadDirect_UShort2() +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU16() * tcScale[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU16() * tcScale[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadDirect_Short1() +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)DataReadU16() * tcScale[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadDirect_Short2() +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)DataReadU16() * tcScale[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)DataReadU16() * tcScale[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadDirect_Float1() +{ + ((u32*)VertexManager::s_pCurBufferPointer)[0] = DataReadU32(); + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadDirect_Float2() +{ + ((u32*)VertexManager::s_pCurBufferPointer)[0] = DataReadU32(); + ((u32*)VertexManager::s_pCurBufferPointer)[1] = DataReadU32(); + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +// ================================================================================== +void LOADERDECL TexCoord_ReadIndex8_UByte1() +{ + u8 Index = DataReadU8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScale[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex8_UByte2() +{ + u8 Index = DataReadU8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScale[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u8)Memory_Read_U8(iAddress+1) * tcScale[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex8_Byte1() +{ + u8 Index = DataReadU8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScale[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex8_Byte2() +{ + u8 Index = DataReadU8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScale[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)Memory_Read_U8(iAddress+1) * tcScale[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex8_UShort1() +{ + u8 Index = DataReadU8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScale[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex8_UShort2() +{ + u8 Index = DataReadU8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScale[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u16)Memory_Read_U16(iAddress+2) * tcScale[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex8_Short1() +{ + u8 Index = DataReadU8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScale[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex8_Short2() +{ + u8 Index = DataReadU8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScale[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)Memory_Read_U16(iAddress+2) * tcScale[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex8_Float1() +{ + u16 Index = DataReadU8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + ((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress); + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex8_Float2() +{ + u16 Index = DataReadU8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + ((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress); + ((u32*)VertexManager::s_pCurBufferPointer)[1] = Memory_Read_U32(iAddress+4); + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +// ================================================================================== +void LOADERDECL TexCoord_ReadIndex16_UByte1() +{ + u16 Index = DataReadU16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScale[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex16_UByte2() +{ + u16 Index = DataReadU16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScale[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u8)Memory_Read_U8(iAddress+1) * tcScale[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex16_Byte1() +{ + u16 Index = DataReadU16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScale[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex16_Byte2() +{ + u16 Index = DataReadU16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScale[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)Memory_Read_U8(iAddress+1) * tcScale[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex16_UShort1() +{ + u16 Index = DataReadU16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScale[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex16_UShort2() +{ + u16 Index = DataReadU16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScale[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u16)Memory_Read_U16(iAddress+2) * tcScale[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex16_Short1() +{ + u16 Index = DataReadU16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScale[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex16_Short2() +{ + u16 Index = DataReadU16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScale[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)Memory_Read_U16(iAddress+2) * tcScale[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex16_Float1() +{ + u16 Index = DataReadU16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress); + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex16_Float2() +{ + u16 Index = DataReadU16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress); + ((u32*)VertexManager::s_pCurBufferPointer)[1] = Memory_Read_U32(iAddress + 4); + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_TextCoord.h b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_TextCoord.h index f6b7aa6b7c..e7572636db 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_TextCoord.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_TextCoord.h @@ -18,314 +18,36 @@ #ifndef VERTEXLOADER_TEXCOORD_H #define VERTEXLOADER_TEXCOORD_H -#define LOG_TEX1() PRIM_LOG("tex: %f, ", ((float*)VertexManager::s_pCurBufferPointer)[0]); -#define LOG_TEX2() PRIM_LOG("tex: %f %f, ", ((float*)VertexManager::s_pCurBufferPointer)[0], ((float*)VertexManager::s_pCurBufferPointer)[1]); - -extern int tcIndex; - -void LOADERDECL TexCoord_Read_Dummy() -{ - tcIndex++; -} - -void LOADERDECL TexCoord_ReadDirect_UByte1() -{ - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU8() * tcScaleU[tcIndex]; - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadDirect_UByte2() -{ - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU8() * tcScaleU[tcIndex]; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU8() * tcScaleV[tcIndex]; - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} - -void LOADERDECL TexCoord_ReadDirect_Byte1() -{ - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)DataReadU8() * tcScaleU[tcIndex]; - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadDirect_Byte2() -{ - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)DataReadU8() * tcScaleU[tcIndex]; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)DataReadU8() * tcScaleV[tcIndex]; - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} - -void LOADERDECL TexCoord_ReadDirect_UShort1() -{ - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU16() * tcScaleU[tcIndex]; - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadDirect_UShort2() -{ - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)DataReadU16() * tcScaleU[tcIndex]; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)DataReadU16() * tcScaleV[tcIndex]; - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} - -void LOADERDECL TexCoord_ReadDirect_Short1() -{ - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)DataReadU16() * tcScaleU[tcIndex]; - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadDirect_Short2() -{ - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)DataReadU16() * tcScaleU[tcIndex]; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)DataReadU16() * tcScaleV[tcIndex]; - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} - -void LOADERDECL TexCoord_ReadDirect_Float1() -{ - ((u32*)VertexManager::s_pCurBufferPointer)[0] = DataReadU32(); - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadDirect_Float2() -{ - ((u32*)VertexManager::s_pCurBufferPointer)[0] = DataReadU32(); - ((u32*)VertexManager::s_pCurBufferPointer)[1] = DataReadU32(); - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} - -// ================================================================================== -void LOADERDECL TexCoord_ReadIndex8_UByte1() -{ - u8 Index = DataReadU8(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadIndex8_UByte2() -{ - u8 Index = DataReadU8(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u8)Memory_Read_U8(iAddress+1) * tcScaleV[tcIndex]; - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} - -void LOADERDECL TexCoord_ReadIndex8_Byte1() -{ - u8 Index = DataReadU8(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadIndex8_Byte2() -{ - u8 Index = DataReadU8(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)Memory_Read_U8(iAddress+1) * tcScaleV[tcIndex]; - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} - -void LOADERDECL TexCoord_ReadIndex8_UShort1() -{ - u8 Index = DataReadU8(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadIndex8_UShort2() -{ - u8 Index = DataReadU8(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u16)Memory_Read_U16(iAddress+2) * tcScaleV[tcIndex]; - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} - -void LOADERDECL TexCoord_ReadIndex8_Short1() -{ - u8 Index = DataReadU8(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadIndex8_Short2() -{ - u8 Index = DataReadU8(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)Memory_Read_U16(iAddress+2) * tcScaleV[tcIndex]; - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} - -void LOADERDECL TexCoord_ReadIndex8_Float1() -{ - u16 Index = DataReadU8(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - ((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress); - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadIndex8_Float2() -{ - u16 Index = DataReadU8(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - ((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress); - ((u32*)VertexManager::s_pCurBufferPointer)[1] = Memory_Read_U32(iAddress+4); - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} - -// ================================================================================== -void LOADERDECL TexCoord_ReadIndex16_UByte1() -{ - u16 Index = DataReadU16(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadIndex16_UByte2() -{ - u16 Index = DataReadU16(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u8)Memory_Read_U8(iAddress+1) * tcScaleV[tcIndex]; - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} - -void LOADERDECL TexCoord_ReadIndex16_Byte1() -{ - u16 Index = DataReadU16(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadIndex16_Byte2() -{ - u16 Index = DataReadU16(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)Memory_Read_U8(iAddress+1) * tcScaleV[tcIndex]; - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} - -void LOADERDECL TexCoord_ReadIndex16_UShort1() -{ - u16 Index = DataReadU16(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadIndex16_UShort2() -{ - u16 Index = DataReadU16(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u16)Memory_Read_U16(iAddress+2) * tcScaleV[tcIndex]; - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} - -void LOADERDECL TexCoord_ReadIndex16_Short1() -{ - u16 Index = DataReadU16(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadIndex16_Short2() -{ - u16 Index = DataReadU16(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; - ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)Memory_Read_U16(iAddress+2) * tcScaleV[tcIndex]; - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} - -void LOADERDECL TexCoord_ReadIndex16_Float1() -{ - u16 Index = DataReadU16(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress); - LOG_TEX1(); - VertexManager::s_pCurBufferPointer += 4; - tcIndex++; -} -void LOADERDECL TexCoord_ReadIndex16_Float2() -{ - u16 Index = DataReadU16(); - u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); - - ((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress); - ((u32*)VertexManager::s_pCurBufferPointer)[1] = Memory_Read_U32(iAddress + 4); - LOG_TEX2(); - VertexManager::s_pCurBufferPointer += 8; - tcIndex++; -} +void LOADERDECL TexCoord_Read_Dummy(); +void LOADERDECL TexCoord_ReadDirect_UByte1(); +void LOADERDECL TexCoord_ReadDirect_UByte2(); +void LOADERDECL TexCoord_ReadDirect_Byte1(); +void LOADERDECL TexCoord_ReadDirect_Byte2(); +void LOADERDECL TexCoord_ReadDirect_UShort1(); +void LOADERDECL TexCoord_ReadDirect_UShort2(); +void LOADERDECL TexCoord_ReadDirect_Short1(); +void LOADERDECL TexCoord_ReadDirect_Short2(); +void LOADERDECL TexCoord_ReadDirect_Float1(); +void LOADERDECL TexCoord_ReadDirect_Float2(); +void LOADERDECL TexCoord_ReadIndex8_UByte1(); +void LOADERDECL TexCoord_ReadIndex8_UByte2(); +void LOADERDECL TexCoord_ReadIndex8_Byte1(); +void LOADERDECL TexCoord_ReadIndex8_Byte2(); +void LOADERDECL TexCoord_ReadIndex8_UShort1(); +void LOADERDECL TexCoord_ReadIndex8_UShort2(); +void LOADERDECL TexCoord_ReadIndex8_Short1(); +void LOADERDECL TexCoord_ReadIndex8_Short2(); +void LOADERDECL TexCoord_ReadIndex8_Float1(); +void LOADERDECL TexCoord_ReadIndex8_Float2(); +void LOADERDECL TexCoord_ReadIndex16_UByte1(); +void LOADERDECL TexCoord_ReadIndex16_UByte2(); +void LOADERDECL TexCoord_ReadIndex16_Byte1(); +void LOADERDECL TexCoord_ReadIndex16_Byte2(); +void LOADERDECL TexCoord_ReadIndex16_UShort1(); +void LOADERDECL TexCoord_ReadIndex16_UShort2(); +void LOADERDECL TexCoord_ReadIndex16_Short1(); +void LOADERDECL TexCoord_ReadIndex16_Short2(); +void LOADERDECL TexCoord_ReadIndex16_Float1(); +void LOADERDECL TexCoord_ReadIndex16_Float2(); #endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp b/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp index 3d43d6b5ba..c7461cc7b2 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp @@ -227,8 +227,6 @@ void Flush() FRAGMENTSHADER* ps = PixelShaderMngr::GetShader(); VERTEXSHADER* vs = VertexShaderMngr::GetShader(s_prevcomponents); - //if (!ps) PanicAlert("Pixel shader = 0. Argh."); - //if (!vs) PanicAlert("Vertex shader = 0. Argh."); bool bRestoreBuffers = false; if (Renderer::GetZBufferTarget()) { @@ -295,7 +293,7 @@ void Flush() if (bRestoreBuffers) { GLenum s_drawbuffers[2] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT}; glDrawBuffers(2, s_drawbuffers); - SetColorMask(); + Renderer::SetColorMask(); } ResetBuffer(); @@ -374,8 +372,8 @@ void EnableComponents(u32 components) xfregs.colChans[i].color.enablelighting = false; } } - s_prevcomponents = components; - } + s_prevcomponents = components; + } } } // namespace diff --git a/Source/Plugins/Plugin_VideoOGL/Src/XFB.cpp b/Source/Plugins/Plugin_VideoOGL/Src/XFB.cpp index 3f1011ee3f..923eb4b78f 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/XFB.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/XFB.cpp @@ -82,11 +82,15 @@ void XFB_Draw(u8 *xfb_in_ram, u32 width, u32 height, s32 yOffset) glViewport(nXoff, nYoff, nBackbufferWidth, nBackbufferHeight); GL_REPORT_ERRORD(); + float w = (float)width; + float h = (float)height; + float yOff = (float)yOffset; + glBegin(GL_QUADS); - glTexCoord2f(width, 0 - yOffset); glVertex2f(1,-1); - glTexCoord2f(width, height - yOffset); glVertex2f(1,1); - glTexCoord2f(0, height - yOffset); glVertex2f(-1,1); - glTexCoord2f(0, 0 - yOffset); glVertex2f(-1,-1); + glTexCoord2f(w, 0 - yOff); glVertex2f(1, -1); + glTexCoord2f(w, h - yOff); glVertex2f(1, 1); + glTexCoord2f(0, h - yOff); glVertex2f(-1, 1); + glTexCoord2f(0, 0 - yOff); glVertex2f(-1,-1); glEnd(); TextureMngr::DisableStage(0);