diff --git a/Source/Plugins/Plugin_VideoSoftware/CMakeLists.txt b/Source/Plugins/Plugin_VideoSoftware/CMakeLists.txt index dd34855536..e7f3cab500 100644 --- a/Source/Plugins/Plugin_VideoSoftware/CMakeLists.txt +++ b/Source/Plugins/Plugin_VideoSoftware/CMakeLists.txt @@ -22,6 +22,7 @@ set(SRCS Src/BPMemLoader.cpp Src/VertexFormatConverter.cpp Src/VertexLoader.cpp Src/VideoConfig.cpp + Src/VideoConfigDialog.cpp Src/XFMemLoader.cpp) set(LIBS videocommon diff --git a/Source/Plugins/Plugin_VideoSoftware/Plugin_VideoSoftware.vcproj b/Source/Plugins/Plugin_VideoSoftware/Plugin_VideoSoftware.vcproj index 4ff6a9cad7..4cc4c0943d 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Plugin_VideoSoftware.vcproj +++ b/Source/Plugins/Plugin_VideoSoftware/Plugin_VideoSoftware.vcproj @@ -663,6 +663,14 @@ RelativePath=".\Src\VideoConfig.h" > + + + + diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Clipper.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/Clipper.cpp index 4af6f2c886..3280fbd58c 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/Clipper.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/Clipper.cpp @@ -59,13 +59,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Clipper { - float m_ViewOffset[3]; - OutputVertexData ClippedVertices[18]; - OutputVertexData *Vertices[21]; + enum { NUM_CLIPPED_VERTICES = 33, NUM_INDICES = NUM_CLIPPED_VERTICES + 3 }; + + float m_ViewOffset[3]; + OutputVertexData ClippedVertices[NUM_CLIPPED_VERTICES]; + OutputVertexData *Vertices[NUM_INDICES]; void Init() { - for (int i = 0; i < 18; ++i) + for (int i = 0; i < NUM_CLIPPED_VERTICES; ++i) Vertices[i+3] = &ClippedVertices[i]; } @@ -282,7 +284,7 @@ namespace Clipper if(!CullTest(v0, v1, v2, backface)) return; - int indices[21] = { 0, 1, 2, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, + int indices[NUM_INDICES] = { 0, 1, 2, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG, SKIP_FLAG }; int numIndices = 3; @@ -304,7 +306,8 @@ namespace Clipper for(int i = 0; i+3 <= numIndices; i+=3) { - if(indices[i] != SKIP_FLAG) + _assert_(i < NUM_INDICES); + if(indices[i] != SKIP_FLAG) { PerspectiveDivide(Vertices[indices[i]]); PerspectiveDivide(Vertices[indices[i+1]]); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.cpp index 4ead73e582..a4313968c6 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.cpp @@ -34,10 +34,16 @@ namespace DebugUtil { u32 skipFrames = 0; -const int NumObjectBuffers = 32; -u8 ObjectBuffer[NumObjectBuffers][EFB_WIDTH*EFB_HEIGHT*4]; +bool drawingHwTriangles = false; + +enum { NumObjectBuffers = 40}; + +u32 ObjectBuffer[NumObjectBuffers][EFB_WIDTH*EFB_HEIGHT]; +u32 TempBuffer[NumObjectBuffers]; + bool DrawnToBuffer[NumObjectBuffers]; const char* ObjectBufferName[NumObjectBuffers]; +int BufferBase[NumObjectBuffers]; void Init() { @@ -46,6 +52,7 @@ void Init() memset(ObjectBuffer[i], 0, sizeof(ObjectBuffer[i])); DrawnToBuffer[i] = false; ObjectBufferName[i] = 0; + BufferBase[i] = 0; } } @@ -168,10 +175,12 @@ void DumpDepth(const char* filename) delete []data; } -void DrawObjectBuffer(s16 x, s16 y, u8 *color, int buffer, const char *name) +void DrawObjectBuffer(s16 x, s16 y, u8 *color, int bufferBase, int subBuffer, const char *name) { - u32 offset = (x + y * EFB_WIDTH) * 4; - u8 *dst = &ObjectBuffer[buffer][offset]; + int buffer = bufferBase + subBuffer; + + u32 offset = (x + y * EFB_WIDTH) * 4; + u8 *dst = (u8*)&ObjectBuffer[buffer][offset]; *(dst++) = color[2]; *(dst++) = color[1]; *(dst++) = color[0]; @@ -179,6 +188,28 @@ void DrawObjectBuffer(s16 x, s16 y, u8 *color, int buffer, const char *name) DrawnToBuffer[buffer] = true; ObjectBufferName[buffer] = name; + BufferBase[buffer] = bufferBase; +} + +void DrawTempBuffer(u8 *color, int buffer) +{ + u8 *dst = (u8*)&TempBuffer[buffer]; + *(dst++) = color[2]; + *(dst++) = color[1]; + *(dst++) = color[0]; + *(dst++) = color[3]; +} + +void CopyTempBuffer(s16 x, s16 y, int bufferBase, int subBuffer, const char *name) +{ + int buffer = bufferBase + subBuffer; + + u32 offset = (x + y * EFB_WIDTH); + ObjectBuffer[buffer][offset] = TempBuffer[buffer]; + + DrawnToBuffer[buffer] = true; + ObjectBufferName[buffer] = name; + BufferBase[buffer] = bufferBase; } void OnObjectBegin() @@ -189,7 +220,10 @@ void OnObjectBegin() DumpActiveTextures(); if (g_Config.bHwRasterizer) + { HwRasterizer::BeginTriangles(); + drawingHwTriangles = true; + } } } @@ -200,8 +234,11 @@ void OnObjectEnd() if (g_Config.bDumpObjects && stats.thisFrame.numDrawnObjects >= g_Config.drawStart && stats.thisFrame.numDrawnObjects < g_Config.drawEnd) DumpEfb(StringFromFormat("%sobject%i.tga", File::GetUserPath(D_DUMPFRAMES_IDX), stats.thisFrame.numDrawnObjects).c_str()); - if (g_Config.bHwRasterizer) + if (g_Config.bHwRasterizer || drawingHwTriangles) + { HwRasterizer::EndTriangles(); + drawingHwTriangles = false; + } for (int i = 0; i < NumObjectBuffers; i++) { @@ -209,7 +246,7 @@ void OnObjectEnd() { DrawnToBuffer[i] = false; (void)SaveTGA(StringFromFormat("%sobject%i_%s(%i).tga", File::GetUserPath(D_DUMPFRAMES_IDX), - stats.thisFrame.numDrawnObjects, ObjectBufferName[i], i).c_str(), EFB_WIDTH, EFB_HEIGHT, ObjectBuffer[i]); + stats.thisFrame.numDrawnObjects, ObjectBufferName[i], i - BufferBase[i]).c_str(), EFB_WIDTH, EFB_HEIGHT, ObjectBuffer[i]); memset(ObjectBuffer[i], 0, sizeof(ObjectBuffer[i])); } } diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.h b/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.h index 02252f3868..4b2f0b86aa 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/DebugUtil.h @@ -31,7 +31,10 @@ namespace DebugUtil void OnFrameEnd(); - void DrawObjectBuffer(s16 x, s16 y, u8 *color, int buffer, const char *name); + void DrawObjectBuffer(s16 x, s16 y, u8 *color, int bufferBase, int subBuffer, const char *name); + + void DrawTempBuffer(u8 *color, int buffer); + void CopyTempBuffer(s16 x, s16 y, int bufferBase, int subBuffer, const char *name); } #endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp index 28a9497b1a..d7d77d981f 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp @@ -26,13 +26,16 @@ #include "DebugUtil.h" #include "HwRasterizer.h" #include "CommandProcessor.h" +#include "GLUtil.h" namespace EfbCopy { void CopyToXfb() { - if (!g_Config.bHwRasterizer) + OpenGL_Update(); // just updates the render window position and the backbuffer size + + if (!g_Config.bHwRasterizer) { // copy to open gl for rendering EfbInterface::UpdateColorTexture(); @@ -45,9 +48,12 @@ namespace EfbCopy void CopyToRam() { - u8 *dest_ptr = g_VideoInitialize.pGetMemoryPointer(bpmem.copyTexDest << 5); + if (!g_Config.bHwRasterizer) + { + u8 *dest_ptr = g_VideoInitialize.pGetMemoryPointer(bpmem.copyTexDest << 5); - TextureEncoder::Encode(dest_ptr); + TextureEncoder::Encode(dest_ptr); + } } void ClearEfb() diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp index 71a5a3669f..3d335f366d 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp @@ -32,8 +32,6 @@ namespace HwRasterizer { float efbHalfWidth; float efbHalfHeight; - float texWidth; - float texHeight; bool hasTexture; u8 *temp; @@ -54,9 +52,6 @@ namespace HwRasterizer TexCacheEntry &cacheEntry = textures[imageAddr]; cacheEntry.Update(); - texWidth = (float)(bpmem.texcoords[0].s.scale_minus_1 + 1); - texHeight = (float)(bpmem.texcoords[0].t.scale_minus_1 + 1); - glBindTexture(GL_TEXTURE_RECTANGLE_ARB, cacheEntry.texture); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, texUnit.texMode0[0].mag_filter ? GL_LINEAR : GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, (texUnit.texMode0[0].min_filter >= 4) ? GL_LINEAR : GL_NEAREST); @@ -90,8 +85,14 @@ namespace HwRasterizer void DrawTextureVertex(OutputVertexData *v) { - glTexCoord2f(v->texCoords[0].x * texWidth, v->texCoords[0].y * texHeight); - glVertex3f(v->screenPosition.x / efbHalfWidth - 1.0f, 1.0f - v->screenPosition.y / efbHalfHeight, v->screenPosition.z); + float s = v->texCoords[0].x; + float t = v->texCoords[0].y; + glTexCoord2f(s, t); + + float x = (v->screenPosition.x / efbHalfWidth) - 1.0f; + float y = 1.0f - (v->screenPosition.y / efbHalfHeight); + float z = v->screenPosition.z; + glVertex3f(x, y, z); } void DrawTriangleFrontFace(OutputVertexData *v0, OutputVertexData *v1, OutputVertexData *v2) diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Renderer.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/Renderer.cpp index 52575900f3..360ee70789 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/Renderer.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/Renderer.cpp @@ -149,9 +149,7 @@ void Renderer::DrawDebugText() void Renderer::DrawTexture(u8 *texture, int width, int height) { - OpenGL_Update(); // just updates the render window position and the backbuffer size - - GLsizei glWidth = (GLsizei)OpenGL_GetBackbufferWidth(); + GLsizei glWidth = (GLsizei)OpenGL_GetBackbufferWidth(); GLsizei glHeight = (GLsizei)OpenGL_GetBackbufferHeight(); // Update GLViewPort diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SConscript b/Source/Plugins/Plugin_VideoSoftware/Src/SConscript index 64d9f45892..b15c94c7cb 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SConscript +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SConscript @@ -31,6 +31,7 @@ files = [ 'VertexFormatConverter.cpp', 'VertexLoader.cpp', 'VideoConfig.cpp', + 'VideoConfigDialog.cpp', 'XFMemLoader.cpp', ] diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Tev.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/Tev.cpp index c0d4904f71..f277948fba 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/Tev.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/Tev.cpp @@ -26,6 +26,12 @@ #include +#ifdef _DEBUG +#define ALLOW_TEV_DUMPS 1 +#else +#define ALLOW_TEV_DUMPS 0 +#endif + void Tev::Init() { FixedConstants[0] = 0; @@ -592,11 +598,11 @@ void Tev::Draw() TextureSampler::Sample(Uv[texcoordSel].s >> scaleS, Uv[texcoordSel].t >> scaleT, IndirectLod[stageNum], IndirectLinear[stageNum], texmap, IndirectTex[stageNum]); -#ifdef _DEBUG +#if ALLOW_TEV_DUMPS if (g_Config.bDumpTevStages) { u8 stage[4] = {(u8)IndirectTex[stageNum][3], (u8)IndirectTex[stageNum][2], (u8)IndirectTex[stageNum][1], 255}; - DebugUtil::DrawObjectBuffer(Position[0], Position[1], stage, 16+stageNum, "Ind"); + DebugUtil::DrawTempBuffer(stage, INDIRECT + stageNum); } #endif } @@ -624,6 +630,11 @@ void Tev::Draw() TextureSampler::Sample(TexCoord.s, TexCoord.t, TextureLod[stageNum], TextureLinear[stageNum], texmap, texel); +#if ALLOW_TEV_DUMPS + if (g_Config.bDumpTevTextureFetches) + DebugUtil::DrawTempBuffer(texel, DIRECT_TFETCH + stageNum); +#endif + int swaptable = ac.tswap * 2; TexColor[0] = texel[bpmem.tevksel[swaptable].swap1]; @@ -673,11 +684,11 @@ void Tev::Draw() else Reg[ac.dest][ALP_C] = Clamp1024(Reg[ac.dest][ALP_C]); -#ifdef _DEBUG +#if ALLOW_TEV_DUMPS if (g_Config.bDumpTevStages) { u8 stage[4] = {(u8)Reg[0][0], (u8)Reg[0][1], (u8)Reg[0][2], (u8)Reg[0][3]}; - DebugUtil::DrawObjectBuffer(Position[0], Position[1], stage, stageNum, "Stage"); + DebugUtil::DrawTempBuffer(stage, DIRECT + stageNum); } #endif } @@ -775,6 +786,26 @@ void Tev::Draw() return; } +#if ALLOW_TEV_DUMPS + if (g_Config.bDumpTevStages) + { + for (u32 i = 0; i < bpmem.genMode.numindstages; ++i) + DebugUtil::CopyTempBuffer(Position[0], Position[1], INDIRECT, i, "Indirect"); + for (u32 i = 0; i <= bpmem.genMode.numtevstages; ++i) + DebugUtil::CopyTempBuffer(Position[0], Position[1], DIRECT, i, "Stage"); + } + + if (g_Config.bDumpTevTextureFetches) + { + for (u32 i = 0; i <= bpmem.genMode.numtevstages; ++i) + { + TwoTevStageOrders &order = bpmem.tevorders[i >> 1]; + if (order.getEnable(i & 1)) + DebugUtil::CopyTempBuffer(Position[0], Position[1], DIRECT_TFETCH, i, "TFetch"); + } + } +#endif + INCSTAT(stats.thisFrame.tevPixelsOut); EfbInterface::BlendTev(Position[0], Position[1], output); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Tev.h b/Source/Plugins/Plugin_VideoSoftware/Src/Tev.h index 4fc2b42502..81da736952 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/Tev.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/Tev.h @@ -55,6 +55,13 @@ class Tev u8 m_ScaleLShiftLUT[4]; u8 m_ScaleRShiftLUT[4]; + enum BufferBase + { + DIRECT = 0, + DIRECT_TFETCH = 16, + INDIRECT = 32 + }; + void SetRasColor(int colorChan, int swaptable); void DrawColorRegular(TevStageCombiner::ColorCombiner &cc); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.cpp index b56f77479e..746762901b 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.cpp @@ -19,46 +19,73 @@ #include "IniFile.h" #include "VideoConfig.h" -Config g_Config; +VideoConfig g_Config; -Config::Config() +VideoConfig::VideoConfig() { bFullscreen = false; bHideCursor = false; renderToMainframe = false; + bHwRasterizer = false; + bShowStats = false; + bDumpTextures = false; bDumpObjects = false; bDumpFrames = false; - bDumpTevStages = false; - bHwRasterizer = false; + bDumpTevStages = false; + bDumpTevTextureFetches = false; drawStart = 0; drawEnd = 100000; } -void Config::Load() +void VideoConfig::Load(const char* ini_file) { std::string temp; IniFile iniFile; - iniFile.Load((std::string(File::GetUserPath(D_CONFIG_IDX)) + "gfx_software.ini").c_str()); + iniFile.Load(ini_file); iniFile.Get("Hardware", "Fullscreen", &bFullscreen, 0); // Hardware iniFile.Get("Hardware", "RenderToMainframe", &renderToMainframe, false); + + iniFile.Get("Rendering", "HwRasterizer", &bHwRasterizer, false); + + iniFile.Get("Info", "ShowStats", &bShowStats, false); + + iniFile.Get("Utility", "DumpTexture", &bDumpTextures, false); + iniFile.Get("Utility", "DumpObjects", &bDumpObjects, false); + iniFile.Get("Utility", "DumpFrames", &bDumpFrames, false); + iniFile.Get("Utility", "DumpTevStages", &bDumpTevStages, false); + iniFile.Get("Utility", "DumpTevTexFetches", &bDumpTevTextureFetches, false); + + iniFile.Get("Misc", "DrawStart", &drawStart, 0); + iniFile.Get("Misc", "DrawEnd", &drawEnd, 100000); } - - -void Config::Save() +void VideoConfig::Save(const char* ini_file) { IniFile iniFile; - iniFile.Load((std::string(File::GetUserPath(D_CONFIG_IDX)) + "gfx_software.ini").c_str()); + iniFile.Load(ini_file); iniFile.Set("Hardware", "Fullscreen", bFullscreen); iniFile.Set("Hardware", "RenderToMainframe", renderToMainframe); + + iniFile.Set("Rendering", "HwRasterizer", bHwRasterizer); + + iniFile.Set("Info", "ShowStats", bShowStats); + + iniFile.Set("Utility", "DumpTexture", bDumpTextures); + iniFile.Set("Utility", "DumpObjects", bDumpObjects); + iniFile.Set("Utility", "DumpFrames", bDumpFrames); + iniFile.Set("Utility", "DumpTevStages", bDumpTevStages); + iniFile.Set("Utility", "DumpTevTexFetches", bDumpTevTextureFetches); + + iniFile.Set("Misc", "DrawStart", drawStart); + iniFile.Set("Misc", "DrawEnd", drawEnd); - iniFile.Save((std::string(File::GetUserPath(D_CONFIG_IDX)) + "gfx_opengl.ini").c_str()); + iniFile.Save(ini_file); } diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.h b/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.h index e6c88e6180..fe52b494a0 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfig.h @@ -23,29 +23,33 @@ #define STATISTICS 1 // NEVER inherit from this class. -struct Config : NonCopyable +struct VideoConfig : NonCopyable { - Config(); - void Load(); - void Save(); + VideoConfig(); + void Load(const char* ini_file); + void Save(const char* ini_file); // General bool bFullscreen; bool bHideCursor; bool renderToMainframe; + bool bHwRasterizer; + bool bShowStats; + bool bDumpTextures; bool bDumpObjects; bool bDumpFrames; - bool bDumpTevStages; - bool bHwRasterizer; + // Debug only + bool bDumpTevStages; + bool bDumpTevTextureFetches; u32 drawStart; u32 drawEnd; }; -extern Config g_Config; +extern VideoConfig g_Config; #endif // _PLUGIN_VIDEOSOFTWARE_CONFIG_H_ diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp new file mode 100644 index 0000000000..aceaf0ec58 --- /dev/null +++ b/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.cpp @@ -0,0 +1,143 @@ +// 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 "VideoConfigDialog.h" + +#include "FileUtil.h" + +#define _connect_macro_(b, f, c, s) (b)->Connect(wxID_ANY, (c), wxCommandEventHandler( f ), (wxObject*)0, (wxEvtHandler*)s) + +// template instantiation +template class BoolSetting; + +template <> +SettingCheckBox::BoolSetting(wxWindow* parent, const wxString& label, bool &setting, bool reverse, long style) : + wxCheckBox(parent, -1, label, wxDefaultPosition, wxDefaultSize, style), + m_setting(setting), + m_reverse(reverse) +{ + SetValue(m_setting ^ m_reverse); + _connect_macro_(this, SettingCheckBox::UpdateValue, wxEVT_COMMAND_CHECKBOX_CLICKED, this); +} + +template +IntegerSetting::IntegerSetting(wxWindow* parent, const wxString& label, T& setting, int minVal, int maxVal, long style) : + wxSpinCtrl(parent, -1, label, wxDefaultPosition, wxDefaultSize, style), + m_setting(setting) +{ + SetRange(minVal, maxVal); + SetValue(m_setting); + _connect_macro_(this, IntegerSetting::UpdateValue, wxEVT_COMMAND_SPINCTRL_UPDATED, this); +} + + +VideoConfigDialog::VideoConfigDialog(wxWindow* parent, const std::string& title, const std::string& _ininame) : + wxDialog(parent, -1, + wxString(wxT("Dolphin ")).append(wxString::FromAscii(title.c_str())).append(wxT(" Graphics Configuration")), + wxDefaultPosition, wxDefaultSize), + vconfig(g_Config), + ininame(_ininame) +{ + vconfig.Load((File::GetUserPath(D_CONFIG_IDX) + ininame + ".ini").c_str()); + + wxNotebook* const notebook = new wxNotebook(this, -1, wxDefaultPosition, wxDefaultSize); + + // -- GENERAL -- + { + wxPanel* const page_general= new wxPanel(notebook, -1, wxDefaultPosition); + notebook->AddPage(page_general, wxT("General")); + wxBoxSizer* const szr_general = new wxBoxSizer(wxVERTICAL); + + // - rendering + { + wxStaticBoxSizer* const group_rendering = new wxStaticBoxSizer(wxVERTICAL, page_general, wxT("Rendering")); + szr_general->Add(group_rendering, 0, wxEXPAND | wxALL, 5); + wxGridSizer* const szr_rendering = new wxGridSizer(2, 5, 5); + group_rendering->Add(szr_rendering, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5); + + szr_rendering->Add(new SettingCheckBox(page_general, wxT("Hardware rasterization"), vconfig.bHwRasterizer)); + } + + // - info + { + wxStaticBoxSizer* const group_info = new wxStaticBoxSizer(wxVERTICAL, page_general, wxT("Overlay Information")); + szr_general->Add(group_info, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5); + wxGridSizer* const szr_info = new wxGridSizer(2, 5, 5); + group_info->Add(szr_info, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5); + + szr_info->Add(new SettingCheckBox(page_general, wxT("Various Statistics"), vconfig.bShowStats)); + } + + // - utility + { + wxStaticBoxSizer* const group_utility = new wxStaticBoxSizer(wxVERTICAL, page_general, wxT("Utility")); + szr_general->Add(group_utility, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5); + wxGridSizer* const szr_utility = new wxGridSizer(2, 5, 5); + group_utility->Add(szr_utility, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5); + + szr_utility->Add(new SettingCheckBox(page_general, wxT("Dump Textures"), vconfig.bDumpTextures)); + szr_utility->Add(new SettingCheckBox(page_general, wxT("Dump Objects"), vconfig.bDumpObjects)); + szr_utility->Add(new SettingCheckBox(page_general, wxT("Dump Frames"), vconfig.bDumpFrames)); + + // - debug only + wxStaticBoxSizer* const group_debug_only_utility = new wxStaticBoxSizer(wxHORIZONTAL, page_general, wxT("Debug Only")); + group_utility->Add(group_debug_only_utility, 0, wxEXPAND | wxBOTTOM, 5); + wxGridSizer* const szr_debug_only_utility = new wxGridSizer(2, 5, 5); + group_debug_only_utility->Add(szr_debug_only_utility, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5); + + szr_debug_only_utility->Add(new SettingCheckBox(page_general, wxT("Dump TEV Stages"), vconfig.bDumpTevStages)); + szr_debug_only_utility->Add(new SettingCheckBox(page_general, wxT("Dump Texture Fetches"), vconfig.bDumpTevTextureFetches)); + } + + // - misc + { + wxStaticBoxSizer* const group_misc = new wxStaticBoxSizer(wxVERTICAL, page_general, wxT("Drawn Object Range")); + szr_general->Add(group_misc, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5); + wxFlexGridSizer* const szr_misc = new wxFlexGridSizer(2, 5, 5); + group_misc->Add(szr_misc, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5); + + szr_misc->Add(new U32Setting(page_general, wxT("Start"), vconfig.drawStart, 0, 100000)); + szr_misc->Add(new U32Setting(page_general, wxT("End"), vconfig.drawEnd, 0, 100000)); + } + + page_general->SetSizerAndFit(szr_general); + } + + wxButton* const btn_close = new wxButton(this, -1, wxT("Close"), wxDefaultPosition); + _connect_macro_(btn_close, VideoConfigDialog::Event_ClickClose, wxEVT_COMMAND_BUTTON_CLICKED, this); + + Connect(-1, wxEVT_CLOSE_WINDOW, wxCloseEventHandler(VideoConfigDialog::Event_Close), (wxObject*)0, this); + + wxBoxSizer* const szr_main = new wxBoxSizer(wxVERTICAL); + szr_main->Add(notebook, 1, wxEXPAND | wxALL, 5); + szr_main->Add(btn_close, 0, wxALIGN_RIGHT | wxRIGHT | wxBOTTOM, 5); + + SetSizerAndFit(szr_main); + Center(); +} + +void VideoConfigDialog::Event_ClickClose(wxCommandEvent&) +{ + Close(); +} + +void VideoConfigDialog::Event_Close(wxCloseEvent& ev) +{ + g_Config.Save((File::GetUserPath(D_CONFIG_IDX) + ininame + ".ini").c_str()); + + ev.Skip(); +} diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.h b/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.h new file mode 100644 index 0000000000..4611cd7cf9 --- /dev/null +++ b/Source/Plugins/Plugin_VideoSoftware/Src/VideoConfigDialog.h @@ -0,0 +1,83 @@ +// 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/ + +#ifndef _PLUGIN_VIDEOSOFTWARE_CONFIG_DIAG_H_ +#define _PLUGIN_VIDEOSOFTWARE_CONFIG_DIAG_H_ + +#include +#include + +#include "VideoConfig.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +template +class BoolSetting : public W +{ +public: + BoolSetting(wxWindow* parent, const wxString& label, bool &setting, bool reverse = false, long style = 0); + + void UpdateValue(wxCommandEvent& ev) + { + m_setting = (ev.GetInt() != 0) ^ m_reverse; + ev.Skip(); + } +private: + bool& m_setting; + const bool m_reverse; +}; + +template +class IntegerSetting : public wxSpinCtrl +{ +public: + IntegerSetting(wxWindow* parent, const wxString& label, T& setting, int minVal, int maxVal, long style = 0); + + void UpdateValue(wxCommandEvent& ev) + { + m_setting = ev.GetInt(); + ev.Skip(); + } +private: + T& m_setting; +}; + +typedef BoolSetting SettingCheckBox; +typedef IntegerSetting U32Setting; + +class VideoConfigDialog : public wxDialog +{ +public: + VideoConfigDialog(wxWindow* parent, const std::string &title, const std::string& ininame); + +protected: + void Event_ClickClose(wxCommandEvent&); + void Event_Close(wxCloseEvent&); + + VideoConfig& vconfig; + std::string ininame; +}; + +#endif diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/XFMemLoader.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/XFMemLoader.cpp index eea3ba249b..371c893743 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/XFMemLoader.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/XFMemLoader.cpp @@ -92,5 +92,10 @@ void LoadIndexedXF(u32 val, int array) u32 *pData = (u32*)g_VideoInitialize.pGetMemoryPointer(arraybases[array] + arraystrides[array]*index); - LoadXFReg(size, address, pData); + // byteswap data + u32 buffer[16]; + for (int i = 0; i < size; ++i) + buffer[i] = Common::swap32(*(pData + i)); + + LoadXFReg(size, address, buffer); } diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/main.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/main.cpp index 1c4715e9f3..72c7d82b59 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/main.cpp @@ -19,6 +19,10 @@ #include "Common.h" #include "pluginspecs_video.h" +#if defined(HAVE_WX) && HAVE_WX +#include "VideoConfigDialog.h" +#endif // HAVE_WX + #include "CommandProcessor.h" #include "OpcodeDecoder.h" #include "VideoConfig.h" @@ -34,6 +38,7 @@ #include "LogManager.h" #include "EfbInterface.h" #include "DebugUtil.h" +#include "FileUtil.h" PLUGIN_GLOBALS* globals = NULL; @@ -68,6 +73,11 @@ void *DllDebugger(void *_hParent, bool Show) void DllConfig(void *_hParent) { +#if defined(HAVE_WX) && HAVE_WX + VideoConfigDialog* const diag = new VideoConfigDialog((wxWindow*)_hParent, "Software", "gfx_software"); + diag->ShowModal(); + diag->Destroy(); +#endif } void Initialize(void *init) @@ -75,7 +85,7 @@ void Initialize(void *init) SVideoInitialize *_pVideoInitialize = (SVideoInitialize*)init; g_VideoInitialize = *_pVideoInitialize; - g_Config.Load(); + g_Config.Load((std::string(File::GetUserPath(D_CONFIG_IDX)) + "gfx_software.ini").c_str()); InitBPMemory(); InitXFMemory();