From e4a9faeba413744160e36c57c12b1bf154af8835 Mon Sep 17 00:00:00 2001 From: omegadox Date: Sun, 26 Jul 2009 09:52:35 +0000 Subject: [PATCH] GFX: updated Dates, code formatting cleanup, code cleanup / organization, some unknown BPs uncovered, fixed OGL's config dialog bug, added another shader DSPHLE: Some warning fixes and added some logging for unknown voice cases Please report if anything has broken. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3884 8ced0084-cf51-0410-be5f-012b33b47a6e --- Data/User/Shaders/stereoscopic2.txt | 26 + Source/Core/VideoCommon/Src/AVIDump.cpp | 31 +- Source/Core/VideoCommon/Src/AVIDump.h | 2 +- Source/Core/VideoCommon/Src/BPFunctions.h | 36 +- Source/Core/VideoCommon/Src/BPMemory.cpp | 24 +- Source/Core/VideoCommon/Src/BPMemory.h | 18 +- Source/Core/VideoCommon/Src/BPStructs.cpp | 98 ++-- Source/Core/VideoCommon/Src/CPMemory.cpp | 2 +- Source/Core/VideoCommon/Src/CPMemory.h | 4 +- Source/Core/VideoCommon/Src/Fifo.cpp | 2 +- Source/Core/VideoCommon/Src/Fifo.h | 4 +- Source/Core/VideoCommon/Src/HiresTextures.cpp | 6 +- Source/Core/VideoCommon/Src/HiresTextures.h | 2 +- Source/Core/VideoCommon/Src/ImageWrite.cpp | 2 +- Source/Core/VideoCommon/Src/ImageWrite.h | 2 +- .../Core/VideoCommon/Src/IndexGenerator.cpp | 2 +- Source/Core/VideoCommon/Src/IndexGenerator.h | 2 +- Source/Core/VideoCommon/Src/LookUpTables.cpp | 4 +- Source/Core/VideoCommon/Src/LookUpTables.h | 4 +- .../Core/VideoCommon/Src/NativeVertexFormat.h | 2 +- .../VideoCommon/Src/NativeVertexWriter.cpp | 2 +- .../Core/VideoCommon/Src/NativeVertexWriter.h | 2 +- .../Core/VideoCommon/Src/OpcodeDecoding.cpp | 33 +- Source/Core/VideoCommon/Src/OpcodeDecoding.h | 18 +- .../Core/VideoCommon/Src/PixelShaderGen.cpp | 524 ++++++++++-------- Source/Core/VideoCommon/Src/PixelShaderGen.h | 60 +- .../VideoCommon/Src/PixelShaderManager.cpp | 1 + .../Core/VideoCommon/Src/PixelShaderManager.h | 2 +- Source/Core/VideoCommon/Src/Profiler.cpp | 33 +- Source/Core/VideoCommon/Src/Profiler.h | 6 +- Source/Core/VideoCommon/Src/Statistics.cpp | 2 +- Source/Core/VideoCommon/Src/Statistics.h | 2 +- .../Core/VideoCommon/Src/TextureDecoder.cpp | 150 ++--- Source/Core/VideoCommon/Src/TextureDecoder.h | 2 +- Source/Core/VideoCommon/Src/VertexLoader.cpp | 10 +- .../VideoCommon/Src/VertexLoaderManager.cpp | 2 +- .../Core/VideoCommon/Src/VertexShaderGen.cpp | 2 +- Source/Core/VideoCommon/Src/VertexShaderGen.h | 59 +- .../VideoCommon/Src/VertexShaderManager.cpp | 199 ++++--- .../VideoCommon/Src/VertexShaderManager.h | 4 +- Source/Core/VideoCommon/Src/VideoState.cpp | 5 +- Source/Core/VideoCommon/Src/VideoState.h | 8 +- Source/Core/VideoCommon/Src/XFBConvert.cpp | 2 +- Source/Core/VideoCommon/Src/XFBConvert.h | 2 +- Source/Core/VideoCommon/Src/XFMemory.cpp | 2 +- Source/Core/VideoCommon/Src/XFMemory.h | 163 +++--- Source/Core/VideoCommon/Src/XFStructs.cpp | 238 ++++---- Source/Core/VideoCommon/Src/XFStructs.h | 7 +- Source/Core/VideoCommon/VideoCommon.vcproj | 138 ++--- .../Src/UCodes/UCode_Zelda_Voice.cpp | 10 +- .../Plugin_VideoDX9/Src/BPFunctions.cpp | 28 +- .../Plugin_VideoOGL/Src/BPFunctions.cpp | 28 +- Source/Plugins/Plugin_VideoOGL/Src/Config.cpp | 2 - Source/Plugins/Plugin_VideoOGL/Src/Config.h | 1 - .../Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp | 34 +- .../Plugin_VideoOGL/Src/GUI/ConfigDlg.h | 5 +- Source/Plugins/Plugin_VideoOGL/Src/main.cpp | 35 +- 57 files changed, 1139 insertions(+), 955 deletions(-) create mode 100644 Data/User/Shaders/stereoscopic2.txt diff --git a/Data/User/Shaders/stereoscopic2.txt b/Data/User/Shaders/stereoscopic2.txt new file mode 100644 index 0000000000..f694aec2e6 --- /dev/null +++ b/Data/User/Shaders/stereoscopic2.txt @@ -0,0 +1,26 @@ +// Omega's 3D Stereoscopic filtering (Amber/Blue) +// TODO: Need depth info! + +uniform samplerRECT samp0 : register(s0); + +void main(out float4 ocol0 : COLOR0, in float2 uv0 : TEXCOORD0) +{ + float4 c0 = texRECT(samp0, uv0).rgba; // Source Color + float sep = 5; + float red = c0.r; + float green = c0.g; + float blue = c0.b; + + // Left Eye (Amber) + float4 c2 = texRECT(samp0, uv0 + float2(sep,0)).rgba; + float amber = (c2.r + c2.g) / 2; + red = max(c0.r, amber); + green = max(c0.g, amber); + + // Right Eye (Blue) + float4 c1 = texRECT(samp0, uv0 + float2(-sep,0)).rgba; + blue = max(c0.b, c1.b); + + + ocol0 = float4(red, green, blue, c0.a); +} \ No newline at end of file diff --git a/Source/Core/VideoCommon/Src/AVIDump.cpp b/Source/Core/VideoCommon/Src/AVIDump.cpp index acb4fde624..09723a7a90 100644 --- a/Source/Core/VideoCommon/Src/AVIDump.cpp +++ b/Source/Core/VideoCommon/Src/AVIDump.cpp @@ -73,7 +73,8 @@ bool AVIDump::CreateFile() NOTICE_LOG(VIDEO, "Opening AVI file (%s) for dumping", movie_file_name); // TODO: Make this work with AVIFileOpenW without it throwing REGDB_E_CLASSNOTREG HRESULT hr = AVIFileOpenA(&m_file, movie_file_name, OF_WRITE | OF_CREATE, NULL); - if (FAILED(hr)) { + if (FAILED(hr)) + { if (hr == AVIERR_BADFORMAT) NOTICE_LOG(VIDEO, "The file couldn't be read, indicating a corrupt file or an unrecognized format."); if (hr == AVIERR_MEMORY) NOTICE_LOG(VIDEO, "The file could not be opened because of insufficient memory."); if (hr == AVIERR_FILEREAD) NOTICE_LOG(VIDEO, "A disk error occurred while reading the file."); @@ -82,13 +83,16 @@ bool AVIDump::CreateFile() Stop(); return false; } + SetBitmapFormat(); NOTICE_LOG(VIDEO, "Setting video format..."); - if (!SetVideoFormat()) { + if (!SetVideoFormat()) + { NOTICE_LOG(VIDEO, "Setting video format failed"); Stop(); return false; } + if (!m_fileCount) { if (!SetCompressionOptions()) { NOTICE_LOG(VIDEO, "SetCompressionOptions failed"); @@ -96,12 +100,16 @@ bool AVIDump::CreateFile() return false; } } - if (FAILED(AVIMakeCompressedStream(&m_streamCompressed, m_stream, &m_options, NULL))) { + + if (FAILED(AVIMakeCompressedStream(&m_streamCompressed, m_stream, &m_options, NULL))) + { NOTICE_LOG(VIDEO, "AVIMakeCompressedStream failed"); Stop(); return false; } - if (FAILED(AVIStreamSetFormat(m_streamCompressed, 0, &m_bitmap, m_bitmap.biSize))) { + + if (FAILED(AVIStreamSetFormat(m_streamCompressed, 0, &m_bitmap, m_bitmap.biSize))) + { NOTICE_LOG(VIDEO, "AVIStreamSetFormat failed"); Stop(); return false; @@ -112,18 +120,24 @@ bool AVIDump::CreateFile() void AVIDump::CloseFile() { - if (m_streamCompressed) { + if (m_streamCompressed) + { AVIStreamClose(m_streamCompressed); m_streamCompressed = NULL; } - if (m_stream) { + + if (m_stream) + { AVIStreamClose(m_stream); m_stream = NULL; } - if (m_file) { + + if (m_file) + { AVIFileRelease(m_file); m_file = NULL; } + AVIFileExit(); } @@ -140,7 +154,8 @@ void AVIDump::AddFrame(char *data) m_totalBytes += m_byteBuffer; // Close the recording if the file is more than 2gb // VfW can't properly save files over 2gb in size, but can keep writing to them up to 4gb. - if (m_totalBytes >= 2000000000) { + if (m_totalBytes >= 2000000000) + { CloseFile(); m_fileCount++; CreateFile(); diff --git a/Source/Core/VideoCommon/Src/AVIDump.h b/Source/Core/VideoCommon/Src/AVIDump.h index c81e1b9e4f..66fa9508cc 100644 --- a/Source/Core/VideoCommon/Src/AVIDump.h +++ b/Source/Core/VideoCommon/Src/AVIDump.h @@ -34,4 +34,4 @@ public: static void AddFrame(char *data); }; -#endif +#endif // _AVIDUMP_H diff --git a/Source/Core/VideoCommon/Src/BPFunctions.h b/Source/Core/VideoCommon/Src/BPFunctions.h index b56398bc3b..2aa125f473 100644 --- a/Source/Core/VideoCommon/Src/BPFunctions.h +++ b/Source/Core/VideoCommon/Src/BPFunctions.h @@ -17,11 +17,11 @@ // ------------------------------------------ -// The plugins has to define these functions +// Video plugin must define these functions // ------------------------------------------ -#ifndef _BPFUNCTIONS_H_ -#define _BPFUNCTIONS_H_ +#ifndef _BPFUNCTIONS_H +#define _BPFUNCTIONS_H #include "BPMemory.h" #include "VideoCommon.h" @@ -37,22 +37,22 @@ enum }; void FlushPipeline(); -void SetGenerationMode(const Bypass &bp); -void SetScissor(const Bypass &bp); -void SetLineWidth(const Bypass &bp); -void SetDepthMode(const Bypass &bp); -void SetBlendMode(const Bypass &bp); -void SetDitherMode(const Bypass &bp); -void SetLogicOpMode(const Bypass &bp); -void SetColorMask(const Bypass &bp); -void CopyEFB(const Bypass &bp, const EFBRectangle &rc, const u32 &address, const bool &fromZBuffer, const bool &isIntensityFmt, const u32 ©fmt, const bool &scaleByHalf); -void RenderToXFB(const Bypass &bp, const EFBRectangle &rc, const float &yScale, const float &xfbLines, u32 xfbAddr, const u32 &dstWidth, const u32 &dstHeight); -void ClearScreen(const Bypass &bp, const EFBRectangle &rc); -void RestoreRenderState(const Bypass &bp); +void SetGenerationMode(const BPCmd &bp); +void SetScissor(const BPCmd &bp); +void SetLineWidth(const BPCmd &bp); +void SetDepthMode(const BPCmd &bp); +void SetBlendMode(const BPCmd &bp); +void SetDitherMode(const BPCmd &bp); +void SetLogicOpMode(const BPCmd &bp); +void SetColorMask(const BPCmd &bp); +void CopyEFB(const BPCmd &bp, const EFBRectangle &rc, const u32 &address, const bool &fromZBuffer, const bool &isIntensityFmt, const u32 ©fmt, const bool &scaleByHalf); +void RenderToXFB(const BPCmd &bp, const EFBRectangle &rc, const float &yScale, const float &xfbLines, u32 xfbAddr, const u32 &dstWidth, const u32 &dstHeight); +void ClearScreen(const BPCmd &bp, const EFBRectangle &rc); +void RestoreRenderState(const BPCmd &bp); u8 *GetPointer(const u32 &address); bool GetConfig(const int &type); -void SetSamplerState(const Bypass &bp); -void SetInterlacingMode(const Bypass &bp); +void SetSamplerState(const BPCmd &bp); +void SetInterlacingMode(const BPCmd &bp); }; -#endif // _BPFUNCTIONS_H_ \ No newline at end of file +#endif // _BPFUNCTIONS_H \ No newline at end of file diff --git a/Source/Core/VideoCommon/Src/BPMemory.cpp b/Source/Core/VideoCommon/Src/BPMemory.cpp index 01634c40ba..505f7ac3a3 100644 --- a/Source/Core/VideoCommon/Src/BPMemory.cpp +++ b/Source/Core/VideoCommon/Src/BPMemory.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -16,15 +16,14 @@ // http://code.google.com/p/dolphin-emu/ #include "Common.h" - #include "BPMemory.h" -//BP state +// BP state // STATE_TO_SAVE BPMemory bpmem; // The plugin must implement this. -void BPWritten(const Bypass& bp); +void BPWritten(const BPCmd& bp); // Call browser: OpcodeDecoding.cpp ExecuteDisplayList > Decode() > LoadBPReg() void LoadBPReg(u32 value0) @@ -35,7 +34,7 @@ void LoadBPReg(u32 value0) int newval = (oldval & ~bpmem.bpMask) | (value0 & bpmem.bpMask); int changes = (oldval ^ newval) & 0xFFFFFF; - Bypass bp = {opcode, changes, newval}; + BPCmd bp = {opcode, changes, newval}; //reset the mask register if (opcode != 0xFE) @@ -50,18 +49,19 @@ void BPReload() { for (int i = 0; i < 254; i++) { - switch (i) { - case 0x41: - case 0x45: //GXSetDrawDone - case 0x52: - case 0x65: - case 0x67: // set gp metric? + switch (i) + { + case BPMEM_BLENDMODE: + case BPMEM_SETDRAWDONE: + case BPMEM_TRIGGER_EFB_COPY: + case BPMEM_LOADTLUT1: + case BPMEM_PERF1: case BPMEM_PE_TOKEN_ID: case BPMEM_PE_TOKEN_INT_ID: // Cases in which we DON'T want to reload the BP continue; default: - Bypass bp = {i, 0xFFFFFF, ((u32*)&bpmem)[i]}; + BPCmd bp = {i, 0xFFFFFF, ((u32*)&bpmem)[i]}; BPWritten(bp); } } diff --git a/Source/Core/VideoCommon/Src/BPMemory.h b/Source/Core/VideoCommon/Src/BPMemory.h index 73ffde4963..cd5c15f509 100644 --- a/Source/Core/VideoCommon/Src/BPMemory.h +++ b/Source/Core/VideoCommon/Src/BPMemory.h @@ -32,8 +32,8 @@ #define BPMEM_SCISSORTL 0x20 #define BPMEM_SCISSORBR 0x21 #define BPMEM_LINEPTWIDTH 0x22 -#define BPMEM_SU_COUNTER 0x23 -#define BPMEM_RAS_COUNTER 0x24 +#define BPMEM_PERF0_TRI 0x23 +#define BPMEM_PERF0_QUAD 0x24 #define BPMEM_RAS1_SS0 0x25 #define BPMEM_RAS1_SS1 0x26 #define BPMEM_IREF 0x27 @@ -46,7 +46,7 @@ #define BPMEM_ZCOMPARE 0x43 #define BPMEM_FIELDMASK 0x44 #define BPMEM_SETDRAWDONE 0x45 -#define BPMEM_CLOCK0 0x46 +#define BPMEM_BUSCLOCK0 0x46 #define BPMEM_PE_TOKEN_ID 0x47 #define BPMEM_PE_TOKEN_INT_ID 0x48 #define BPMEM_EFB_TL 0x49 @@ -63,18 +63,18 @@ #define BPMEM_CLEARBBOX1 0x55 #define BPMEM_CLEARBBOX2 0x56 #define BPMEM_UNKOWN_57 0x57 -#define BPMEM_UNKNOWN 0x58 +#define BPMEM_REVBITS 0x58 #define BPMEM_SCISSOROFFSET 0x59 #define BPMEM_UNKNOWN_60 0x60 #define BPMEM_UNKNOWN_61 0x61 #define BPMEM_UNKNOWN_62 0x62 -#define BPMEM_UNKNOWN_63 0x63 +#define BPMEM_TEXMODESYNC 0x63 #define BPMEM_LOADTLUT0 0x64 #define BPMEM_LOADTLUT1 0x65 #define BPMEM_TEXINVALIDATE 0x66 -#define BPMEM_SETGPMETRIC 0x67 +#define BPMEM_PERF1 0x67 #define BPMEM_FIELDMODE 0x68 -#define BPMEM_CLOCK1 0x69 +#define BPMEM_BUSCLOCK1 0x69 #define BPMEM_TX_SETMODE0 0x80 // 0x80 + 4 #define BPMEM_TX_SETMODE1 0x84 // 0x84 + 4 #define BPMEM_TX_SETIMAGE0 0x88 // 0x88 + 4 @@ -827,7 +827,7 @@ union UPE_Copy // All of BP memory ////////////////////////////////////////////////////////////////////////// -struct Bypass +struct BPCmd { int address; int changes; @@ -911,4 +911,4 @@ extern BPMemory bpmem; void LoadBPReg(u32 value0); -#endif +#endif // _BPMEMORY_H diff --git a/Source/Core/VideoCommon/Src/BPStructs.cpp b/Source/Core/VideoCommon/Src/BPStructs.cpp index 171bfc5147..129d82a437 100644 --- a/Source/Core/VideoCommon/Src/BPStructs.cpp +++ b/Source/Core/VideoCommon/Src/BPStructs.cpp @@ -40,27 +40,24 @@ void BPInit() bpmem.bpMask = 0xFFFFFF; } - -// ---------------------------------------------------------------------------------------------------------- -// Write to the Bypass Memory (Bypass Raster State Registers) -/* ------------------ - Called: - At the end of every: OpcodeDecoding.cpp ExecuteDisplayList > Decode() > LoadBPReg - TODO: - Turn into function table. The (future) DisplayList (DL) jit can then call the functions directly, - getting rid of dynamic dispatch. Unfortunately, few games use DLs properly - most\ - just stuff geometry in them and don't put state changes there. */ -// ---------------------------------------------------------------------------------------------------------- -void BPWritten(const Bypass& bp) +void BPWritten(const BPCmd& bp) { - // -------------------------------------------------------------------------------------------------------- - // First the pipeline is flushed then update the bpmem with the new value. - // Some of the BP cases have to call certain functions while others just update the bpmem. - // some bp cases check the changes variable, because they might not have to be updated all the time - // NOTE: it seems not all bp cases like checking changes, so calling if (bp.changes == 0 ? false : true) - // had to be ditched and the games seem to work fine with out it. - // NOTE2: Yet Another Gamecube Documentation calls them Bypass Registers - // -------------------------------------------------------------------------------------------------------- + /* + ---------------------------------------------------------------------------------------------------------------- + Purpose: Writes to the BP registers + Called: At the end of every: OpcodeDecoding.cpp ExecuteDisplayList > Decode() > LoadBPReg + How It Works: First the pipeline is flushed then update the bpmem with the new value. + Some of the BP cases have to call certain functions while others just update the bpmem. + some bp cases check the changes variable, because they might not have to be updated all the time + NOTE: it seems not all bp cases like checking changes, so calling if (bp.changes == 0 ? false : true) + had to be ditched and the games seem to work fine with out it. + NOTE2: Yet Another Gamecube Documentation calls them Bypass Registers but possibly completely wrong + NOTE3: This controls the register groups: RAS1/2, SU, TF, TEV, C/Z, PEC + TODO: Turn into function table. The (future) DisplayList (DL) jit can then call the functions directly, + getting rid of dynamic dispatch. Unfortunately, few games use DLs properly - most\ + just stuff geometry in them and don't put state changes there. + ---------------------------------------------------------------------------------------------------------------- + */ // Debugging only, this lets you skip a bp update //static int times = 0; @@ -111,6 +108,9 @@ void BPWritten(const Bypass& bp) case BPMEM_RAS1_SS1: // Index Texture Coordinate Scale 1 PixelShaderManager::SetIndTexScaleChanged(0x0c); break; + // ---------------- + // Scissor Control + // ---------------- case BPMEM_SCISSORTL: // Scissor Rectable Top, Left case BPMEM_SCISSORBR: // Scissor Rectable Bottom, Right case BPMEM_SCISSOROFFSET: // Scissor Offset @@ -299,29 +299,32 @@ void BPWritten(const Bypass& bp) break; } // ---------------------------------- - // Display Copy Filtering Control + // Display Copy Filtering Control - GX_SetCopyFilter(u8 aa,u8 sample_pattern[12][2],u8 vf,u8 vfilter[7]) // Fields: Destination, Frame2Field, Gamma, Source // TODO: We might have to implement the gamma one, some games might need this, if they are too dark to see. // ---------------------------------- - case BPMEM_DISPLAYCOPYFILER: - case BPMEM_DISPLAYCOPYFILER+1: - case BPMEM_DISPLAYCOPYFILER+2: - case BPMEM_DISPLAYCOPYFILER+3: - case BPMEM_COPYFILTER0: //GXSetCopyFilter - case BPMEM_COPYFILTER1: + case BPMEM_DISPLAYCOPYFILER: // if (aa) { use sample_pattern } else { use 666666 } + case BPMEM_DISPLAYCOPYFILER+1: // if (aa) { use sample_pattern } else { use 666666 } + case BPMEM_DISPLAYCOPYFILER+2: // if (aa) { use sample_pattern } else { use 666666 } + case BPMEM_DISPLAYCOPYFILER+3: // if (aa) { use sample_pattern } else { use 666666 } + case BPMEM_COPYFILTER0: // if (vf) { use vfilter } else { use 595000 } + case BPMEM_COPYFILTER1: // if (vf) { use vfilter } else { use 000015 } break; - case BPMEM_FIELDMASK: // Interlacing Control - case BPMEM_FIELDMODE: + // ----------------------------------- + // Interlacing Control + // ----------------------------------- + case BPMEM_FIELDMASK: // GX_SetFieldMask(u8 even_mask,u8 odd_mask) + case BPMEM_FIELDMODE: // GX_SetFieldMode(u8 field_mode,u8 half_aspect_ratio) SetInterlacingMode(bp); break; - // --------------------------------------------------- - // Debugging/Profiling info, we don't care about them - // --------------------------------------------------- - case BPMEM_CLOCK0: // Some Clock - case BPMEM_CLOCK1: // Some Clock - case BPMEM_SU_COUNTER: // Pixel or Poly Count - case BPMEM_RAS_COUNTER: // Sound Count of something in the Texture Units - case BPMEM_SETGPMETRIC: // Set the Graphic Processor Metric + // ---------------------------------------- + // Unimportant regs (Clock, Perf, ...) + // ---------------------------------------- + case BPMEM_BUSCLOCK0: // TB Bus Clock ? + case BPMEM_BUSCLOCK1: // TB Bus Clock ? + case BPMEM_PERF0_TRI: // Perf: Triangles + case BPMEM_PERF0_QUAD: // Perf: Quads + case BPMEM_PERF1: // Perf: Some Clock, Texels, TX, TC break; // ---------------- // EFB Copy config @@ -338,7 +341,7 @@ void BPWritten(const Bypass& bp) case BPMEM_CLEAR_Z: // Z Components (24-bit Zbuffer) break; // ------------------------- - // Bounding Box support + // Bounding Box Control // ------------------------- case BPMEM_CLEARBBOX1: case BPMEM_CLEARBBOX2: { @@ -367,8 +370,9 @@ void BPWritten(const Bypass& bp) #endif break; } + case BPMEM_TEXINVALIDATE: // Used, if game has manual control the Texture Cache, which we don't allow + DEBUG_LOG(VIDEO, "BP Texture Invalid: %08x", bp.newvalue); case BPMEM_ZCOMPARE: // Set the Z-Compare and EFB pixel format - case BPMEM_TEXINVALIDATE: // Used, if game has manual control the Texture Cache, which we don't allow case BPMEM_MIPMAP_STRIDE: // MipMap Stride Channel case BPMEM_COPYYSCALE: // Display Copy Y Scale case BPMEM_IREF: /* 24 RID @@ -379,8 +383,7 @@ void BPWritten(const Bypass& bp) 9 BC1 - Ind. Tex Stage 1 NTexCoord 6 BI1 - Ind. Tex Stage 1 NTexMap 3 BC0 - Ind. Tex Stage 0 NTexCoord - 0 BI0 - Ind. Tex Stage 0 NTexMap */ - break; + 0 BI0 - Ind. Tex Stage 0 NTexMap */ case BPMEM_TEV_KSEL: // Texture Environment Swap Mode Table 0 case BPMEM_TEV_KSEL+1:// Texture Environment Swap Mode Table 1 case BPMEM_TEV_KSEL+2:// Texture Environment Swap Mode Table 2 @@ -389,27 +392,26 @@ void BPWritten(const Bypass& bp) case BPMEM_TEV_KSEL+5:// Texture Environment Swap Mode Table 5 case BPMEM_TEV_KSEL+6:// Texture Environment Swap Mode Table 6 case BPMEM_TEV_KSEL+7:// Texture Environment Swap Mode Table 7 - break; case BPMEM_BP_MASK: // This Register can be used to limit to which bits of BP registers is actually written to. the mask is // only valid for the next BP command, and will reset itself. case BPMEM_IND_IMASK: // Index Mask ? - break; - case BPMEM_UNKNOWN: // This is always set to 0xF at boot of any game, so this sounds like a useless reg - if (bp.newvalue != 0x0F) - PanicAlert("Unknown is not 0xF! val = 0x%08x", bp.newvalue); + case BPMEM_REVBITS: // Always set to 0x0F when GX_InitRevBits() is called. break; - case BPMEM_UNKOWN_57: // Sunshine uses this: 0xAAA, 0x000, over and over, copy filter related? + case BPMEM_UNKOWN_57: // Sunshine alternates this register between values 0x000 and 0xAAA + DEBUG_LOG(VIDEO, "Uknown BP Reg 0x57: %08x", bp.newvalue); break; case BPMEM_UNKNOWN_60: case BPMEM_UNKNOWN_61: case BPMEM_UNKNOWN_62: - case BPMEM_UNKNOWN_63: // Cases added due to: http://code.google.com/p/dolphin-emu/issues/detail?id=360#c90 // Are these related to BBox? break; + case BPMEM_TEXMODESYNC: // Always set to 0 when GX_TexModeSync() is called. + break; + // ------------------------------------------------ // On Default, we try to look for other things // before we give up and say its an unknown opcode diff --git a/Source/Core/VideoCommon/Src/CPMemory.cpp b/Source/Core/VideoCommon/Src/CPMemory.cpp index 84d0d2d556..9a9f2583a7 100644 --- a/Source/Core/VideoCommon/Src/CPMemory.cpp +++ b/Source/Core/VideoCommon/Src/CPMemory.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/CPMemory.h b/Source/Core/VideoCommon/Src/CPMemory.h index af5be4952f..eb2541d79f 100644 --- a/Source/Core/VideoCommon/Src/CPMemory.h +++ b/Source/Core/VideoCommon/Src/CPMemory.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -262,4 +262,4 @@ extern VAT g_VtxAttr[8]; // Might move this into its own file later. void LoadCPReg(u32 SubCmd, u32 Value); -#endif +#endif // _CPMEMORY_H diff --git a/Source/Core/VideoCommon/Src/Fifo.cpp b/Source/Core/VideoCommon/Src/Fifo.cpp index 5f1491e6ed..f3cc632081 100644 --- a/Source/Core/VideoCommon/Src/Fifo.cpp +++ b/Source/Core/VideoCommon/Src/Fifo.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/Fifo.h b/Source/Core/VideoCommon/Src/Fifo.h index efbf12b7fd..fc787ab02f 100644 --- a/Source/Core/VideoCommon/Src/Fifo.h +++ b/Source/Core/VideoCommon/Src/Fifo.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -42,4 +42,4 @@ void VideoFifo_CheckSwapRequest(); void VideoFifo_CheckSwapRequestAt(u32 xfbAddr, u32 fbWidth, u32 fbHeight); void VideoFifo_CheckEFBAccess(); -#endif +#endif // _FIFO_H diff --git a/Source/Core/VideoCommon/Src/HiresTextures.cpp b/Source/Core/VideoCommon/Src/HiresTextures.cpp index 5b3801b2e9..69db7f0797 100644 --- a/Source/Core/VideoCommon/Src/HiresTextures.cpp +++ b/Source/Core/VideoCommon/Src/HiresTextures.cpp @@ -110,13 +110,15 @@ PC_TexFormat GetHiresTex(const char *fileName, int *pWidth, int *pHeight, int te u8 *temp = SOIL_load_image(textureMap[key].c_str(), &width, &height, &channels, SOIL_LOAD_RGBA); - if (temp == NULL) { + if (temp == NULL) + { ERROR_LOG(VIDEO, "Custom texture %s failed to load", textureMap[key].c_str(), width, height); SOIL_free_image_data(temp); return PC_TEX_FMT_NONE; } - if (width > 1024 || height > 1024) { + if (width > 1024 || height > 1024) + { ERROR_LOG(VIDEO, "Custom texture %s is too large (%ix%i); textures can only be 1024 pixels tall and wide", textureMap[key].c_str(), width, height); SOIL_free_image_data(temp); return PC_TEX_FMT_NONE; diff --git a/Source/Core/VideoCommon/Src/HiresTextures.h b/Source/Core/VideoCommon/Src/HiresTextures.h index 8b5d51fec7..3230a3307c 100644 --- a/Source/Core/VideoCommon/Src/HiresTextures.h +++ b/Source/Core/VideoCommon/Src/HiresTextures.h @@ -29,4 +29,4 @@ void Shutdown(); PC_TexFormat GetHiresTex(const char *fileName, int *pWidth, int *pHeight, int texformat, u8 *data); }; -#endif +#endif // _HIRESTEXTURES_H diff --git a/Source/Core/VideoCommon/Src/ImageWrite.cpp b/Source/Core/VideoCommon/Src/ImageWrite.cpp index e73b246c67..02b1472925 100644 --- a/Source/Core/VideoCommon/Src/ImageWrite.cpp +++ b/Source/Core/VideoCommon/Src/ImageWrite.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/ImageWrite.h b/Source/Core/VideoCommon/Src/ImageWrite.h index 3cdd847321..26569ad0e6 100644 --- a/Source/Core/VideoCommon/Src/ImageWrite.h +++ b/Source/Core/VideoCommon/Src/ImageWrite.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/IndexGenerator.cpp b/Source/Core/VideoCommon/Src/IndexGenerator.cpp index 01ff44a5c0..c0c08f6933 100644 --- a/Source/Core/VideoCommon/Src/IndexGenerator.cpp +++ b/Source/Core/VideoCommon/Src/IndexGenerator.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/IndexGenerator.h b/Source/Core/VideoCommon/Src/IndexGenerator.h index 44500358e0..44b09b4122 100644 --- a/Source/Core/VideoCommon/Src/IndexGenerator.h +++ b/Source/Core/VideoCommon/Src/IndexGenerator.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/LookUpTables.cpp b/Source/Core/VideoCommon/Src/LookUpTables.cpp index 3bb7cc5695..a2964f2d3a 100644 --- a/Source/Core/VideoCommon/Src/LookUpTables.cpp +++ b/Source/Core/VideoCommon/Src/LookUpTables.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -34,8 +34,10 @@ void InitLUTs() { for (int i = 0; i < 32; i++) shiftLookup[i] = 1.0f / float(1 << i); + for (int i = 0; i < 64; i++) lut6to8[i] = (i*255) / 63; + for (int i = 0; i < 256; i++) { lutu8tosfloat[i] = (float)(i - 128) / 127.0f; diff --git a/Source/Core/VideoCommon/Src/LookUpTables.h b/Source/Core/VideoCommon/Src/LookUpTables.h index 4d37fc6786..bc321baf47 100644 --- a/Source/Core/VideoCommon/Src/LookUpTables.h +++ b/Source/Core/VideoCommon/Src/LookUpTables.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -31,4 +31,4 @@ extern float shiftLookup[32]; void InitLUTs(); -#endif +#endif // _LOOKUPTABLES_H diff --git a/Source/Core/VideoCommon/Src/NativeVertexFormat.h b/Source/Core/VideoCommon/Src/NativeVertexFormat.h index edc7b76123..1d1587aaf9 100644 --- a/Source/Core/VideoCommon/Src/NativeVertexFormat.h +++ b/Source/Core/VideoCommon/Src/NativeVertexFormat.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/NativeVertexWriter.cpp b/Source/Core/VideoCommon/Src/NativeVertexWriter.cpp index b0c65bc842..e5206b2c0b 100644 --- a/Source/Core/VideoCommon/Src/NativeVertexWriter.cpp +++ b/Source/Core/VideoCommon/Src/NativeVertexWriter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/NativeVertexWriter.h b/Source/Core/VideoCommon/Src/NativeVertexWriter.h index dc7b94dbb0..db1fd78411 100644 --- a/Source/Core/VideoCommon/Src/NativeVertexWriter.h +++ b/Source/Core/VideoCommon/Src/NativeVertexWriter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/OpcodeDecoding.cpp b/Source/Core/VideoCommon/Src/OpcodeDecoding.cpp index d0b8bb7ece..50b7ad2972 100644 --- a/Source/Core/VideoCommon/Src/OpcodeDecoding.cpp +++ b/Source/Core/VideoCommon/Src/OpcodeDecoding.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -54,7 +54,7 @@ static void ExecuteDisplayList(u32 address, u32 size) u8* startAddress = Memory_GetPtr(address); //Avoid the crash if Memory_GetPtr failed .. - if (startAddress!=0) + if (startAddress != 0) { g_pVideoData = startAddress; @@ -87,8 +87,9 @@ bool FifoCommandRunnable() switch (Cmd) { - case GX_NOP: - // Hm, this means that we scan over nop streams pretty slowly... + case GX_NOP: // Hm, this means that we scan over nop streams pretty slowly... + case GX_CMD_INVL_VC: // Invalidate Vertex Cache - no parameters + case 0x44: // zelda 4 swords calls it and checks the metrics registers after that iCommandSize = 1; break; @@ -100,6 +101,7 @@ bool FifoCommandRunnable() case GX_LOAD_INDX_B: case GX_LOAD_INDX_C: case GX_LOAD_INDX_D: + case GX_LOAD_BP_REG: iCommandSize = 5; break; @@ -107,19 +109,6 @@ bool FifoCommandRunnable() iCommandSize = 9; break; - case 0x44: - iCommandSize = 1; - // zelda 4 swords calls it and checks the metrics registers after that - break; - - case GX_CMD_INVL_VC: // invalid vertex cache - no parameter? - iCommandSize = 1; - break; - - case GX_LOAD_BP_REG: - iCommandSize = 5; - break; - case GX_LOAD_XF_REG: { // check if we can read the header @@ -154,8 +143,9 @@ bool FifoCommandRunnable() } else { + // TODO(Omega): Maybe dump FIFO to file on this error char szTemp[1024]; - sprintf(szTemp, "GFX: Unknown Opcode (0x%x).\n" + sprintf(szTemp, "GFX FIFO: Unknown Opcode (0x%x).\n" "This means one of the following:\n" "* The emulated GPU got desynced, disabling dual core can help\n" "* Command stream corrupted by some spurious memory bug\n" @@ -256,13 +246,12 @@ static void Decode() } break; - case 0x44: + case 0x44: // zelda 4 swords calls it and checks the metrics registers after that DEBUG_LOG(VIDEO, "GX 0x44: %08x", Cmd); - // zelda 4 swords calls it and checks the metrics registers after that break; - case GX_CMD_INVL_VC:// Invalidate (vertex cache?) - DEBUG_LOG(VIDEO, "Invalidate (vertex cache?)"); + case GX_CMD_INVL_VC: // Invalidate Vertex Cache + DEBUG_LOG(VIDEO, "Invalidate (vertex cache?)"); break; case GX_LOAD_BP_REG: //0x61 diff --git a/Source/Core/VideoCommon/Src/OpcodeDecoding.h b/Source/Core/VideoCommon/Src/OpcodeDecoding.h index f2502e6b49..fa2abb6962 100644 --- a/Source/Core/VideoCommon/Src/OpcodeDecoding.h +++ b/Source/Core/VideoCommon/Src/OpcodeDecoding.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -36,16 +36,16 @@ #define GX_VAT_MASK 0x07 //these are defined 1/8th of their real values and without their top bit -#define GX_DRAW_QUADS 0x0 //0x80 -#define GX_DRAW_TRIANGLES 0x2 //0x90 -#define GX_DRAW_TRIANGLE_STRIP 0x3 //0x98 -#define GX_DRAW_TRIANGLE_FAN 0x4 //0xA0 -#define GX_DRAW_LINES 0x5 //0xA8 -#define GX_DRAW_LINE_STRIP 0x6 //0xB0 -#define GX_DRAW_POINTS 0x7 //0xB8 +#define GX_DRAW_QUADS 0x0 // 0x80 +#define GX_DRAW_TRIANGLES 0x2 // 0x90 +#define GX_DRAW_TRIANGLE_STRIP 0x3 // 0x98 +#define GX_DRAW_TRIANGLE_FAN 0x4 // 0xA0 +#define GX_DRAW_LINES 0x5 // 0xA8 +#define GX_DRAW_LINE_STRIP 0x6 // 0xB0 +#define GX_DRAW_POINTS 0x7 // 0xB8 void OpcodeDecoder_Init(); void OpcodeDecoder_Shutdown(); void OpcodeDecoder_Run(); -#endif +#endif // _OPCODE_DECODING_H diff --git a/Source/Core/VideoCommon/Src/PixelShaderGen.cpp b/Source/Core/VideoCommon/Src/PixelShaderGen.cpp index 52603e3cc8..871b64f3a6 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/Src/PixelShaderGen.cpp @@ -31,10 +31,12 @@ void GetPixelShaderId(PIXELSHADERUID &uid, u32 s_texturemask, u32 dstAlphaEnable) { u32 projtexcoords = 0; - for (u32 i = 0; i < (u32)bpmem.genMode.numtevstages + 1; i++) { - if (bpmem.tevorders[i/2].getEnable(i&1)) { - int texcoord = bpmem.tevorders[i/2].getTexCoord(i&1); - if (xfregs.texcoords[texcoord].texmtxinfo.projection ) + for (u32 i = 0; i < (u32)bpmem.genMode.numtevstages + 1; i++) + { + if (bpmem.tevorders[i/2].getEnable(i & 1)) + { + int texcoord = bpmem.tevorders[i / 2].getTexCoord(i & 1); + if (xfregs.texcoords[texcoord].texmtxinfo.projection) projtexcoords |= 1 << texcoord; } } @@ -49,7 +51,7 @@ void GetPixelShaderId(PIXELSHADERUID &uid, u32 s_texturemask, u32 dstAlphaEnable uid.values[0] = (uid.values[0] & ~0x0ff00000) | (projtexcoords << 20); // swap table for (int i = 0; i < 8; i += 2) - ((u8*)&uid.values[1])[i/2] = (bpmem.tevksel[i].hex & 0xf) | ((bpmem.tevksel[i + 1].hex & 0xf) << 4); + ((u8*)&uid.values[1])[i / 2] = (bpmem.tevksel[i].hex & 0xf) | ((bpmem.tevksel[i + 1].hex & 0xf) << 4); uid.values[2] = s_texturemask; @@ -58,20 +60,22 @@ void GetPixelShaderId(PIXELSHADERUID &uid, u32 s_texturemask, u32 dstAlphaEnable int hdr = 4; u32* pcurvalue = &uid.values[hdr]; - for (u32 i = 0; i < (u32)bpmem.genMode.numtevstages+1; ++i) { + for (u32 i = 0; i < (u32)bpmem.genMode.numtevstages + 1; ++i) + { TevStageCombiner::ColorCombiner &cc = bpmem.combiners[i].colorC; TevStageCombiner::AlphaCombiner &ac = bpmem.combiners[i].alphaC; u32 val0 = cc.hex&0xffffff; u32 val1 = ac.hex&0xffffff; - val0 |= bpmem.tevksel[i/2].getKC(i&1)<<24; - val1 |= bpmem.tevksel[i/2].getKA(i&1)<<24; + val0 |= bpmem.tevksel[i / 2].getKC(i & 1) << 24; + val1 |= bpmem.tevksel[i / 2].getKA(i & 1) << 24; pcurvalue[0] = val0; pcurvalue[1] = val1; pcurvalue += 2; } - for (u32 i = 0; i < ((u32)bpmem.genMode.numtevstages+1)/2; ++i) { + for (u32 i = 0; i < ((u32)bpmem.genMode.numtevstages+1) / 2; ++i) + { u32 val0, val1; if (bpmem.tevorders[i].hex & 0x40) val0 = bpmem.tevorders[i].hex & 0x3ff; @@ -86,6 +90,7 @@ void GetPixelShaderId(PIXELSHADERUID &uid, u32 s_texturemask, u32 dstAlphaEnable case 0: pcurvalue[0] = val0|(val1<<10); break; case 1: pcurvalue[0] |= val0<<20; pcurvalue[1] = val1; pcurvalue++; break; case 2: pcurvalue[1] |= (val0<<10)|(val1<<20); pcurvalue++; break; + default: PanicAlert("Uknown case for Tev Stages / 2: %08x", (i % 3)); } } @@ -96,10 +101,12 @@ void GetPixelShaderId(PIXELSHADERUID &uid, u32 s_texturemask, u32 dstAlphaEnable else val0 = bpmem.tevorders[bpmem.genMode.numtevstages/2].hex & 0x380; - switch (bpmem.genMode.numtevstages % 3) { - case 0: pcurvalue[0] = val0; break; - case 1: pcurvalue[0] |= val0 << 20; break; - case 2: pcurvalue[1] |= val0 << 10; pcurvalue++; break; + switch (bpmem.genMode.numtevstages % 3) + { + case 0: pcurvalue[0] = val0; break; + case 1: pcurvalue[0] |= val0 << 20; break; + case 2: pcurvalue[1] |= val0 << 10; pcurvalue++; break; + default: PanicAlert("Uknown case for Tev Stages: %08x", bpmem.genMode.numtevstages % 3); } } @@ -108,12 +115,15 @@ void GetPixelShaderId(PIXELSHADERUID &uid, u32 s_texturemask, u32 dstAlphaEnable uid.tevstages = (u32)(pcurvalue - &uid.values[0] - hdr); - for (u32 i = 0; i < bpmem.genMode.numindstages; ++i) { + for (u32 i = 0; i < bpmem.genMode.numindstages; ++i) + { u32 val = bpmem.tevind[i].hex & 0x1fffff; // 21 bits - switch (i % 3) { - case 0: pcurvalue[0] = val; break; - case 1: pcurvalue[0] |= val << 21; pcurvalue[1] = val >> 11; ++pcurvalue; break; - case 2: pcurvalue[0] |= val << 10; ++pcurvalue; break; + switch (i % 3) + { + case 0: pcurvalue[0] = val; break; + case 1: pcurvalue[0] |= val << 21; pcurvalue[1] = val >> 11; ++pcurvalue; break; + case 2: pcurvalue[0] |= val << 10; ++pcurvalue; break; + default: PanicAlert("Uknown case for Ind Stages: %08x", (i % 3)); } } @@ -140,95 +150,95 @@ const float epsilon8bit = 1.0f / 255.0f; static const char *tevKSelTableC[] = // KCSEL { - "1.0f,1.0f,1.0f", //1 = 0x00 - "0.875,0.875,0.875",//7_8 = 0x01 - "0.75,0.75,0.75", //3_4 = 0x02 - "0.625,0.625,0.625",//5_8 = 0x03 - "0.5,0.5,0.5", //1_2 = 0x04 - "0.375,0.375,0.375",//3_8 = 0x05 - "0.25,0.25,0.25", //1_4 = 0x06 - "0.125,0.125,0.125",//1_8 = 0x07 - "ERROR", //0x08 - "ERROR", //0x09 - "ERROR", //0x0a - "ERROR", //0x0b - I_KCOLORS"[0].rgb",//K0 = 0x0C - I_KCOLORS"[1].rgb",//K1 = 0x0D - I_KCOLORS"[2].rgb",//K2 = 0x0E - I_KCOLORS"[3].rgb",//K3 = 0x0F - I_KCOLORS"[0].rrr",//K0_R = 0x10 - I_KCOLORS"[1].rrr",//K1_R = 0x11 - I_KCOLORS"[2].rrr",//K2_R = 0x12 - I_KCOLORS"[3].rrr",//K3_R = 0x13 - I_KCOLORS"[0].ggg",//K0_G = 0x14 - I_KCOLORS"[1].ggg",//K1_G = 0x15 - I_KCOLORS"[2].ggg",//K2_G = 0x16 - I_KCOLORS"[3].ggg",//K3_G = 0x17 - I_KCOLORS"[0].bbb",//K0_B = 0x18 - I_KCOLORS"[1].bbb",//K1_B = 0x19 - I_KCOLORS"[2].bbb",//K2_B = 0x1A - I_KCOLORS"[3].bbb",//K3_B = 0x1B - I_KCOLORS"[0].aaa",//K0_A = 0x1C - I_KCOLORS"[1].aaa",//K1_A = 0x1D - I_KCOLORS"[2].aaa",//K2_A = 0x1E - I_KCOLORS"[3].aaa",//K3_A = 0x1F + "1.0f,1.0f,1.0f", // 1 = 0x00 + "0.875,0.875,0.875", // 7_8 = 0x01 + "0.75,0.75,0.75", // 3_4 = 0x02 + "0.625,0.625,0.625", // 5_8 = 0x03 + "0.5,0.5,0.5", // 1_2 = 0x04 + "0.375,0.375,0.375", // 3_8 = 0x05 + "0.25,0.25,0.25", // 1_4 = 0x06 + "0.125,0.125,0.125", // 1_8 = 0x07 + "ERROR", // 0x08 + "ERROR", // 0x09 + "ERROR", // 0x0a + "ERROR", // 0x0b + I_KCOLORS"[0].rgb", // K0 = 0x0C + I_KCOLORS"[1].rgb", // K1 = 0x0D + I_KCOLORS"[2].rgb", // K2 = 0x0E + I_KCOLORS"[3].rgb", // K3 = 0x0F + I_KCOLORS"[0].rrr", // K0_R = 0x10 + I_KCOLORS"[1].rrr", // K1_R = 0x11 + I_KCOLORS"[2].rrr", // K2_R = 0x12 + I_KCOLORS"[3].rrr", // K3_R = 0x13 + I_KCOLORS"[0].ggg", // K0_G = 0x14 + I_KCOLORS"[1].ggg", // K1_G = 0x15 + I_KCOLORS"[2].ggg", // K2_G = 0x16 + I_KCOLORS"[3].ggg", // K3_G = 0x17 + I_KCOLORS"[0].bbb", // K0_B = 0x18 + I_KCOLORS"[1].bbb", // K1_B = 0x19 + I_KCOLORS"[2].bbb", // K2_B = 0x1A + I_KCOLORS"[3].bbb", // K3_B = 0x1B + I_KCOLORS"[0].aaa", // K0_A = 0x1C + I_KCOLORS"[1].aaa", // K1_A = 0x1D + I_KCOLORS"[2].aaa", // K2_A = 0x1E + I_KCOLORS"[3].aaa", // K3_A = 0x1F }; static const char *tevKSelTableA[] = // KASEL { - "1.0f", //1 = 0x00 - "0.875f",//7_8 = 0x01 - "0.75f", //3_4 = 0x02 - "0.625f",//5_8 = 0x03 - "0.5f", //1_2 = 0x04 - "0.375f",//3_8 = 0x05 - "0.25f", //1_4 = 0x06 - "0.125f",//1_8 = 0x07 - "ERROR", //0x08 - "ERROR", //0x09 - "ERROR", //0x0a - "ERROR", //0x0b - "ERROR", //0x0c - "ERROR", //0x0d - "ERROR", //0x0e - "ERROR", //0x0f - I_KCOLORS"[0].r",//K0_R = 0x10 - I_KCOLORS"[1].r",//K1_R = 0x11 - I_KCOLORS"[2].r",//K2_R = 0x12 - I_KCOLORS"[3].r",//K3_R = 0x13 - I_KCOLORS"[0].g",//K0_G = 0x14 - I_KCOLORS"[1].g",//K1_G = 0x15 - I_KCOLORS"[2].g",//K2_G = 0x16 - I_KCOLORS"[3].g",//K3_G = 0x17 - I_KCOLORS"[0].b",//K0_B = 0x18 - I_KCOLORS"[1].b",//K1_B = 0x19 - I_KCOLORS"[2].b",//K2_B = 0x1A - I_KCOLORS"[3].b",//K3_B = 0x1B - I_KCOLORS"[0].a",//K0_A = 0x1C - I_KCOLORS"[1].a",//K1_A = 0x1D - I_KCOLORS"[2].a",//K2_A = 0x1E - I_KCOLORS"[3].a",//K3_A = 0x1F + "1.0f", // 1 = 0x00 + "0.875f",// 7_8 = 0x01 + "0.75f", // 3_4 = 0x02 + "0.625f",// 5_8 = 0x03 + "0.5f", // 1_2 = 0x04 + "0.375f",// 3_8 = 0x05 + "0.25f", // 1_4 = 0x06 + "0.125f",// 1_8 = 0x07 + "ERROR", // 0x08 + "ERROR", // 0x09 + "ERROR", // 0x0a + "ERROR", // 0x0b + "ERROR", // 0x0c + "ERROR", // 0x0d + "ERROR", // 0x0e + "ERROR", // 0x0f + I_KCOLORS"[0].r", // K0_R = 0x10 + I_KCOLORS"[1].r", // K1_R = 0x11 + I_KCOLORS"[2].r", // K2_R = 0x12 + I_KCOLORS"[3].r", // K3_R = 0x13 + I_KCOLORS"[0].g", // K0_G = 0x14 + I_KCOLORS"[1].g", // K1_G = 0x15 + I_KCOLORS"[2].g", // K2_G = 0x16 + I_KCOLORS"[3].g", // K3_G = 0x17 + I_KCOLORS"[0].b", // K0_B = 0x18 + I_KCOLORS"[1].b", // K1_B = 0x19 + I_KCOLORS"[2].b", // K2_B = 0x1A + I_KCOLORS"[3].b", // K3_B = 0x1B + I_KCOLORS"[0].a", // K0_A = 0x1C + I_KCOLORS"[1].a", // K1_A = 0x1D + I_KCOLORS"[2].a", // K2_A = 0x1E + I_KCOLORS"[3].a", // K3_A = 0x1F }; static const char *tevScaleTable[] = // CS { - "1.0f", //SCALE_1 - "2.0f", //SCALE_2 - "4.0f", //SCALE_4 - "0.5f",//DIVIDE_2 + "1.0f", // SCALE_1 + "2.0f", // SCALE_2 + "4.0f", // SCALE_4 + "0.5f", // DIVIDE_2 }; static const char *tevBiasTable[] = // TB { - "", //ZERO, - "+0.5f", //ADDHALF, - "-0.5f", //SUBHALF, + "", // ZERO, + "+0.5f", // ADDHALF, + "-0.5f", // SUBHALF, "", }; static const char *tevOpTable[] = { // TEV - "+", //TEVOP_ADD = 0, - "-", //TEVOP_SUB = 1, + "+", // TEVOP_ADD = 0, + "-", // TEVOP_SUB = 1, }; //static const char *tevCompOpTable[] = { ">", "==" }; @@ -240,22 +250,22 @@ static const char *tevOpTable[] = { // TEV static const char *tevCInputTable[] = // CC { - "prev.rgb", //CPREV, - "prev.aaa", //APREV, - "c0.rgb", //C0, - "c0.aaa", //A0, - "c1.rgb", //C1, - "c1.aaa", //A1, - "c2.rgb", //C2, - "c2.aaa", //A2, - "textemp.rgb", //TEXC, - "textemp.aaa", //TEXA, - "rastemp.rgb", //RASC, - "rastemp.aaa", //RASA, - "float3(1.0f,1.0f,1.0f)", //ONE, - "float3(.5f,.5f,.5f)", //HALF, - "konsttemp.rgb", //KONST, - "float3(0.0f,0.0f,0.0f)", //ZERO + "prev.rgb", // CPREV, + "prev.aaa", // APREV, + "c0.rgb", // C0, + "c0.aaa", // A0, + "c1.rgb", // C1, + "c1.aaa", // A1, + "c2.rgb", // C2, + "c2.aaa", // A2, + "textemp.rgb", // TEXC, + "textemp.aaa", // TEXA, + "rastemp.rgb", // RASC, + "rastemp.aaa", // RASA, + "float3(1.0f,1.0f,1.0f)", // ONE, + "float3(.5f,.5f,.5f)", // HALF, + "konsttemp.rgb", // KONST, + "float3(0.0f,0.0f,0.0f)", // ZERO "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", @@ -265,22 +275,22 @@ static const char *tevCInputTable[] = // CC static const char *tevCInputTable2[] = // CC { - "prev", //CPREV, - "(prev.aaa)", //APREV, - "c0", //C0, - "(c0.aaa)", //A0, - "c1", //C1, - "(c1.aaa)", //A1, - "c2", //C2, - "(c2.aaa)", //A2, - "textemp", //TEXC, - "(textemp.aaa)", //TEXA, - "rastemp", //RASC, - "(rastemp.aaa)", //RASA, - "float3(1.0f,1.0f,1.0f)", //ONE, - "float3(.5f,.5f,.5f)", //HALF, - "konsttemp", //"konsttemp.rgb", //KONST, - "float3(0.0f,0.0f,0.0f)", //ZERO + "prev", // CPREV, + "(prev.aaa)", // APREV, + "c0", // C0, + "(c0.aaa)", // A0, + "c1", // C1, + "(c1.aaa)", // A1, + "c2", // C2, + "(c2.aaa)", // A2, + "textemp", // TEXC, + "(textemp.aaa)", // TEXA, + "rastemp", // RASC, + "(rastemp.aaa)", // RASA, + "float3(1.0f,1.0f,1.0f)", // ONE + "float3(.5f,.5f,.5f)", // HALF + "konsttemp", //"konsttemp.rgb", // KONST + "float3(0.0f,0.0f,0.0f)", // ZERO "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", @@ -290,14 +300,14 @@ static const char *tevCInputTable2[] = // CC static const char *tevAInputTable[] = // CA { - "prev.a", //APREV, - "c0.a", //A0, - "c1.a", //A1, - "c2.a", //A2, - "textemp.a", //TEXA, - "rastemp.a", //RASA, - "konsttemp.a", //KONST - "0.0", //ZERO + "prev.a", // APREV, + "c0.a", // A0, + "c1.a", // A1, + "c2.a", // A2, + "textemp.a", // TEXA, + "rastemp.a", // RASA, + "konsttemp.a", // KONST + "0.0", // ZERO "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", @@ -306,14 +316,14 @@ static const char *tevAInputTable[] = // CA static const char *tevAInputTable2[] = // CA { - "prev", //APREV, - "c0", //A0, - "c1", //A1, - "c2", //A2, - "textemp", //TEXA, - "rastemp", //RASA, - "konsttemp", //KONST, (hw1 had quarter) - "float4(0,0,0,0)", //ZERO + "prev", // APREV, + "c0", // A0, + "c1", // A1, + "c2", // A2, + "textemp", // TEXA, + "rastemp", // RASA, + "konsttemp", // KONST, (hw1 had quarter) + "float4(0,0,0,0)", // ZERO "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", "PADERROR", @@ -383,26 +393,29 @@ const char *GeneratePixelShader(u32 texture_mask, bool dstAlphaEnable, bool HLSL numStages, numTexgen, bpmem.genMode.numindstages); int nIndirectStagesUsed = 0; - if (bpmem.genMode.numindstages > 0) { - for (int i = 0; i < numStages; ++i) { - if (bpmem.tevind[i].IsActive() && bpmem.tevind[i].bt < bpmem.genMode.numindstages) { + if (bpmem.genMode.numindstages > 0) + { + for (int i = 0; i < numStages; ++i) + { + if (bpmem.tevind[i].IsActive() && bpmem.tevind[i].bt < bpmem.genMode.numindstages) nIndirectStagesUsed |= 1<= 7) { + if (numTexgen >= 7) WRITE(p, "float4 clipPos = float4(uv0.w, uv1.w, uv2.w, uv3.w);\n"); - } // the screen space depth value = far z + (clip z / clip w) * z range WRITE(p, "float zCoord = "I_ZBIAS"[1].x + (clipPos.z / clipPos.w) * "I_ZBIAS"[1].y;\n"); // use the texture input of the last texture stage (textemp), hopefully this has been read and is in correct format... - if (bpmem.ztex2.op == ZTEXTURE_ADD) { + if (bpmem.ztex2.op == ZTEXTURE_ADD) WRITE(p, "depth = frac(dot("I_ZBIAS"[0].xyzw, textemp.xyzw) + "I_ZBIAS"[1].w + zCoord);\n"); - } - else if (bpmem.ztex2.op == ZTEXTURE_REPLACE) { + else if (bpmem.ztex2.op == ZTEXTURE_REPLACE) WRITE(p, "depth = frac(dot("I_ZBIAS"[0].xyzw, textemp.xyzw) + "I_ZBIAS"[1].w);\n"); - } - else { + else WRITE(p, "depth = zCoord;\n"); - } //if (bpmem.genMode.numindstages ) WRITE(p, "prev.rg = indtex0.xy;\nprev.b = 0;\n"); - if (!WriteAlphaTest(p, HLSL)) { + if (!WriteAlphaTest(p, HLSL)) + { // alpha test will always fail, so restart the shader and just make it an empty function p = pmainstart; WRITE(p, "discard;\n"); WRITE(p, "ocol0 = 0;\n"); } - else { - if (dstAlphaEnable) { + else + { + if (dstAlphaEnable) WRITE(p, " ocol0 = float4(prev.rgb,"I_ALPHA"[0].w);\n"); - } else { + else + { WriteFog(p); WRITE(p, " ocol0 = prev;\n"); } } WRITE(p, "}\n"); + if (text[sizeof(text) - 1] != 0x7C) PanicAlert("PixelShader generator - buffer too small, canary has been eaten!"); + return text; } @@ -540,20 +558,20 @@ static void WriteStage(char *&p, int n, u32 texture_mask) bool bHasIndStage = bpmem.tevind[n].IsActive() && bpmem.tevind[n].bt < bpmem.genMode.numindstages; // HACK to handle cases where the tex gen is not enabled - if (!bHasTexCoord) { + if (!bHasTexCoord) texcoord = 0; - } - if (bHasIndStage) { + if (bHasIndStage) + { // perform the indirect op on the incoming regular coordinates using indtex%d as the offset coords - if (bpmem.tevind[n].bs != ITBA_OFF) { + if (bpmem.tevind[n].bs != ITBA_OFF) + { // write the bump alpha - - if (bpmem.tevind[n].fmt == ITF_8) { + if (bpmem.tevind[n].fmt == ITF_8) WRITE(p, "alphabump = indtex%d.%s %s;\n", bpmem.tevind[n].bt, tevIndAlphaSel[bpmem.tevind[n].bs], tevIndAlphaScale[bpmem.tevind[n].fmt]); - } - else { + else + { // donkopunchstania: really bad way to do this // cannot always use fract because fract(1.0) is 0.0 when it needs to be 1.0 // omitting fract seems to work as well @@ -574,72 +592,68 @@ static void WriteStage(char *&p, int n, u32 texture_mask) WRITE(p, "indtevcrd%d.%s += %s;\n", n, tevIndBiasField[bpmem.tevind[n].bias], tevIndBiasAdd[bpmem.tevind[n].fmt]); // multiply by offset matrix and scale - if (bpmem.tevind[n].mid != 0) { - if (bpmem.tevind[n].mid <= 3) { + if (bpmem.tevind[n].mid != 0) + { + if (bpmem.tevind[n].mid <= 3) + { int mtxidx = 2*(bpmem.tevind[n].mid-1); WRITE(p, "float2 indtevtrans%d = float2(dot("I_INDTEXMTX"[%d].xyz, indtevcrd%d), dot("I_INDTEXMTX"[%d].xyz, indtevcrd%d));\n", n, mtxidx, n, mtxidx+1, n); } - else if (bpmem.tevind[n].mid <= 7 && bHasTexCoord) { // s matrix + else if (bpmem.tevind[n].mid <= 7 && bHasTexCoord) + { // s matrix int mtxidx = 2*(bpmem.tevind[n].mid-5); WRITE(p, "float2 indtevtrans%d = "I_INDTEXMTX"[%d].ww * uv%d.xy * indtevcrd%d.xx;\n", n, mtxidx, texcoord, n); } - else if (bpmem.tevind[n].mid <= 11 && bHasTexCoord) { // t matrix + else if (bpmem.tevind[n].mid <= 11 && bHasTexCoord) + { // t matrix int mtxidx = 2*(bpmem.tevind[n].mid-9); WRITE(p, "float2 indtevtrans%d = "I_INDTEXMTX"[%d].ww * uv%d.xy * indtevcrd%d.yy;\n", n, mtxidx, texcoord, n); } - else { + else WRITE(p, "float2 indtevtrans%d = 0;\n", n); - } } - else { + else WRITE(p, "float2 indtevtrans%d = 0;\n", n); - } - // wrapping + // --------- + // Wrapping + // --------- // wrap S - if (bpmem.tevind[n].sw == ITW_OFF) { + if (bpmem.tevind[n].sw == ITW_OFF) WRITE(p, "wrappedcoord.x = uv%d.x;\n", texcoord); - } - else if (bpmem.tevind[n].sw == ITW_0) { + else if (bpmem.tevind[n].sw == ITW_0) WRITE(p, "wrappedcoord.x = 0.0f;\n"); - } - else { + else WRITE(p, "wrappedcoord.x = fmod( uv%d.x, %s );\n", texcoord, tevIndWrapStart[bpmem.tevind[n].sw]); - } // wrap T - if (bpmem.tevind[n].tw == ITW_OFF) { + if (bpmem.tevind[n].tw == ITW_OFF) WRITE(p, "wrappedcoord.y = uv%d.y;\n", texcoord); - } - else if (bpmem.tevind[n].tw == ITW_0) { + else if (bpmem.tevind[n].tw == ITW_0) WRITE(p, "wrappedcoord.y = 0.0f;\n"); - } - else { + else WRITE(p, "wrappedcoord.y = fmod( uv%d.y, %s );\n", texcoord, tevIndWrapStart[bpmem.tevind[n].tw]); - } - if (bpmem.tevind[n].fb_addprev) { - // add previous tevcoord + if (bpmem.tevind[n].fb_addprev) // add previous tevcoord WRITE(p, "tevcoord.xy += wrappedcoord + indtevtrans%d;\n", n); - } - else { + else WRITE(p, "tevcoord.xy = wrappedcoord + indtevtrans%d;\n", n); - } } WRITE(p, "rastemp=%s.%s;\n", tevRasTable[bpmem.tevorders[n / 2].getColorChan(n & 1)],rasswap); - if (bpmem.tevorders[n/2].getEnable(n&1)) { + if (bpmem.tevorders[n/2].getEnable(n&1)) + { int texmap = bpmem.tevorders[n/2].getTexMap(n&1); - if(!bHasIndStage) { + if(!bHasIndStage) + { // calc tevcord - if(bHasTexCoord) { + if(bHasTexCoord) WRITE(p, "tevcoord.xy = uv%d.xy;\n", texcoord); - } else { + else WRITE(p, "tevcoord.xy = float2(0.0f,0.0f);\n"); - } } SampleTexture(p, "textemp", "tevcoord", texswap, texmap, texture_mask); @@ -647,8 +661,8 @@ static void WriteStage(char *&p, int n, u32 texture_mask) else WRITE(p, "textemp=float4(1,1,1,1);\n"); - int kc = bpmem.tevksel[n/2].getKC(n&1); - int ka = bpmem.tevksel[n/2].getKA(n&1); + int kc = bpmem.tevksel[n / 2].getKC(n & 1); + int ka = bpmem.tevksel[n / 2].getKA(n & 1); TevStageCombiner::ColorCombiner &cc = bpmem.combiners[n].colorC; TevStageCombiner::AlphaCombiner &ac = bpmem.combiners[n].alphaC; @@ -661,16 +675,19 @@ static void WriteStage(char *&p, int n, u32 texture_mask) WRITE(p, "%s= ", tevCOutputTable[cc.dest]); // combine the color channel - if (cc.bias != 3) { // if not compare + if (cc.bias != 3) // if not compare + { //normal color combiner goes here WRITE(p, " %s*(%s%s",tevScaleTable[cc.shift],tevCInputTable[cc.d],tevOpTable[cc.op]); WRITE(p, "lerp(%s,%s,%s) %s);\n", tevCInputTable[cc.a], tevCInputTable[cc.b], tevCInputTable[cc.c], tevBiasTable[cc.bias]); } - else { + else + { int cmp = (cc.shift<<1)|cc.op|8; // comparemode stored here - switch(cmp) { + switch(cmp) + { case TEVCMP_R8_GT: case TEVCMP_RGB8_GT: // per component compares WRITE(p, " %s + ((%s.%s > %s.%s) ? %s : float3(0.0f,0.0f,0.0f));\n", @@ -704,17 +721,20 @@ static void WriteStage(char *&p, int n, u32 texture_mask) // combine the alpha channel WRITE(p, "%s= ", tevAOutputTable[ac.dest]); - if (ac.bias != 3) { // if not compare + if (ac.bias != 3) // if not compare + { //normal alpha combiner goes here WRITE(p, " %s*(%s%s",tevScaleTable[ac.shift],tevAInputTable[ac.d],tevOpTable[ac.op]); WRITE(p, "lerp(%s,%s,%s) %s)\n", tevAInputTable[ac.a],tevAInputTable[ac.b], tevAInputTable[ac.c],tevBiasTable[ac.bias]); } - else { + else + { //compare alpha combiner goes here int cmp = (ac.shift<<1)|ac.op|8; // comparemode stored here - switch(cmp) { + switch(cmp) + { case TEVCMP_R8_GT: case TEVCMP_A8_GT: WRITE(p, " %s + ((%s.%s > %s.%s) ? %s : 0)\n", @@ -746,6 +766,7 @@ static void WriteStage(char *&p, int n, u32 texture_mask) if (ac.clamp) WRITE(p, "%s = clamp(%s,0.0f,1.0f);\n", tevAOutputTable[ac.dest],tevAOutputTable[ac.dest]); + WRITE(p, "\n"); } @@ -784,7 +805,8 @@ void SampleTexture(char *&p, const char *destination, const char *texcoords, con static void WriteAlphaCompare(char *&p, int num, int comp) { - switch(comp) { + switch(comp) + { case ALPHACMP_ALWAYS: WRITE(p, "(false)"); break; case ALPHACMP_NEVER: WRITE(p, "(true)"); break; case ALPHACMP_LEQUAL: WRITE(p, "(prev.a > %s)",alphaRef[num]); break; @@ -793,6 +815,7 @@ static void WriteAlphaCompare(char *&p, int num, int comp) case ALPHACMP_GREATER: WRITE(p, "(prev.a <= %s + %f)",alphaRef[num],epsilon8bit*0.5f);break; case ALPHACMP_EQUAL: WRITE(p, "(abs(prev.a-%s)>%f)",alphaRef[num],epsilon8bit*2); break; case ALPHACMP_NEQUAL: WRITE(p, "(abs(prev.a-%s)<%f)",alphaRef[num],epsilon8bit*2); break; + default: PanicAlert("Bad Alpha Compare! %08x", comp); } } @@ -802,55 +825,69 @@ static bool WriteAlphaTest(char *&p, bool HLSL) u32 comp[2] = {bpmem.alphaFunc.comp0,bpmem.alphaFunc.comp1}; //first kill all the simple cases - switch(op) { - case 0: // and - if (comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_ALWAYS) return true; - if (comp[0] == ALPHACMP_NEVER || comp[1] == ALPHACMP_NEVER) { + switch(op) + { + case 0: // AND + if (comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_ALWAYS) + return true; + if (comp[0] == ALPHACMP_NEVER || comp[1] == ALPHACMP_NEVER) + { WRITE(p, "discard;\n"); return false; } break; - case 1: // or - if (comp[0] == ALPHACMP_ALWAYS || comp[1] == ALPHACMP_ALWAYS) return true; - if (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_NEVER) { + case 1: // OR + if (comp[0] == ALPHACMP_ALWAYS || comp[1] == ALPHACMP_ALWAYS) + return true; + if (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_NEVER) + { WRITE(p, "discard;\n"); return false; } break; - case 2: // xor - if ( (comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_NEVER) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_ALWAYS) ) return true; - if ( (comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_ALWAYS) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_NEVER)) { + case 2: // XOR + if ((comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_NEVER) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_ALWAYS)) + return true; + if ((comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_ALWAYS) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_NEVER)) + { WRITE(p, "discard;\n"); return false; } break; - case 3: // xnor - if ( (comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_NEVER) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_ALWAYS)) { + case 3: // XNOR + if ((comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_NEVER) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_ALWAYS)) + { WRITE(p, "discard;\n"); return false; } - if ( (comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_ALWAYS) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_NEVER) ) + if ((comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_ALWAYS) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_NEVER)) return true; break; + default: PanicAlert("bad logic for alpha test? %08x", op); } // Seems we need discard for Cg and clip for d3d. sigh. if (HLSL) WRITE(p, "clip( "); - else { + else WRITE(p, "discard( "); - } + WriteAlphaCompare(p, 0, bpmem.alphaFunc.comp0); // negated because testing the inverse condition - switch (bpmem.alphaFunc.logic) { + switch (bpmem.alphaFunc.logic) + { case 0: WRITE(p, " || "); break; // and case 1: WRITE(p, " && "); break; // or case 2: WRITE(p, " == "); break; // xor case 3: WRITE(p, " != "); break; // xnor + default: break; } + WriteAlphaCompare(p, 1, bpmem.alphaFunc.comp1); + WRITE(p, ");\n"); + return true; } @@ -858,12 +895,16 @@ static void WriteFog(char *&p) { bool enabled = bpmem.fog.c_proj_fsel.fsel == 0 ? false : true; - if (enabled) { - if (bpmem.fog.c_proj_fsel.proj == 0) { + if (enabled) + { + if (bpmem.fog.c_proj_fsel.proj == 0) + { // perspective // ze = A/(B - Zs) WRITE (p, " float ze = "I_FOG"[1].x / ("I_FOG"[1].y - depth);\n"); - } else { + } + else + { // orthographic // ze = a*Zs WRITE (p, " float ze = "I_FOG"[1].x * depth;\n"); @@ -872,7 +913,8 @@ static void WriteFog(char *&p) WRITE (p, " float fog = clamp(ze - "I_FOG"[1].z, 0.0f, 1.0f);\n"); } - switch (bpmem.fog.c_proj_fsel.fsel) { + switch (bpmem.fog.c_proj_fsel.fsel) + { case 2: // linear // empty break; @@ -890,9 +932,9 @@ static void WriteFog(char *&p) WRITE(p, " fog = 1.0f - fog;\n"); WRITE(p, " fog = pow(2, -8.0f * fog * fog);\n"); break; + default: PanicAlert("Unknown Fog Type! %08x", bpmem.fog.c_proj_fsel.fsel); } - if (enabled) { + if (enabled) WRITE(p, " prev.rgb = (1.0f - fog) * prev.rgb + (fog * "I_FOG"[0].rgb);\n"); - } } diff --git a/Source/Core/VideoCommon/Src/PixelShaderGen.h b/Source/Core/VideoCommon/Src/PixelShaderGen.h index ded4887850..57deddaa4f 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderGen.h +++ b/Source/Core/VideoCommon/Src/PixelShaderGen.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -15,32 +15,32 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#ifndef GCOGL_PIXELSHADER -#define GCOGL_PIXELSHADER +#ifndef GCOGL_PIXELSHADER_H +#define GCOGL_PIXELSHADER_H #include "Common.h" -#define I_COLORS "color" -#define I_KCOLORS "k" -#define I_ALPHA "alphaRef" -#define I_TEXDIMS "texdim" -#define I_ZBIAS "czbias" +#define I_COLORS "color" +#define I_KCOLORS "k" +#define I_ALPHA "alphaRef" +#define I_TEXDIMS "texdim" +#define I_ZBIAS "czbias" #define I_INDTEXSCALE "cindscale" -#define I_INDTEXMTX "cindmtx" -#define I_FOG "cfog" +#define I_INDTEXMTX "cindmtx" +#define I_FOG "cfog" -#define C_COLORS 0 -#define C_KCOLORS (C_COLORS+4) -#define C_ALPHA (C_KCOLORS+4) -#define C_TEXDIMS (C_ALPHA+1) -#define C_ZBIAS (C_TEXDIMS+8) -#define C_INDTEXSCALE (C_ZBIAS+2) -#define C_INDTEXMTX (C_INDTEXSCALE+2) -#define C_FOG (C_INDTEXMTX+6) -#define C_ENVCONST_END (C_FOG+2) +#define C_COLORS 0 +#define C_KCOLORS (C_COLORS + 4) +#define C_ALPHA (C_KCOLORS + 4) +#define C_TEXDIMS (C_ALPHA + 1) +#define C_ZBIAS (C_TEXDIMS + 8) +#define C_INDTEXSCALE (C_ZBIAS + 2) +#define C_INDTEXMTX (C_INDTEXSCALE + 2) +#define C_FOG (C_INDTEXMTX + 6) +#define C_ENVCONST_END (C_FOG + 2) -#define C_COLORMATRIX (C_FOG+2) -#define PIXELSHADERUID_MAX_VALUES (5+32+6+11) +#define C_COLORMATRIX (C_FOG + 2) +#define PIXELSHADERUID_MAX_VALUES (5 + 32 + 6 + 11) class PIXELSHADERUID { @@ -48,10 +48,12 @@ public: u32 values[PIXELSHADERUID_MAX_VALUES]; u16 tevstages, indstages; - PIXELSHADERUID() { + PIXELSHADERUID() + { memset(values, 0, PIXELSHADERUID_MAX_VALUES * 4); tevstages = indstages = 0; } + PIXELSHADERUID(const PIXELSHADERUID& r) { tevstages = r.tevstages; @@ -61,9 +63,12 @@ public: for (int i = 0; i < N; ++i) values[i] = r.values[i]; } - int GetNumValues() const { + + int GetNumValues() const + { return tevstages + indstages + 4; } + bool operator <(const PIXELSHADERUID& _Right) const { if (values[0] < _Right.values[0]) @@ -71,7 +76,8 @@ public: else if (values[0] > _Right.values[0]) return false; int N = GetNumValues(); - for (int i = 1; i < N; ++i) { + for (int i = 1; i < N; ++i) + { if (values[i] < _Right.values[i]) return true; else if (values[i] > _Right.values[i]) @@ -79,12 +85,14 @@ public: } return false; } + bool operator ==(const PIXELSHADERUID& _Right) const { if (values[0] != _Right.values[0]) return false; int N = GetNumValues(); - for (int i = 1; i < N; ++i) { + for (int i = 1; i < N; ++i) + { if (values[i] != _Right.values[i]) return false; } @@ -95,4 +103,4 @@ public: const char *GeneratePixelShader(u32 texture_mask, bool dstAlphaEnable, bool HLSL = false); void GetPixelShaderId(PIXELSHADERUID &, u32 s_texturemask, u32 dstAlphaEnable); -#endif +#endif // GCOGL_PIXELSHADER_H diff --git a/Source/Core/VideoCommon/Src/PixelShaderManager.cpp b/Source/Core/VideoCommon/Src/PixelShaderManager.cpp index cb5362bfef..9e8c4306c9 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderManager.cpp +++ b/Source/Core/VideoCommon/Src/PixelShaderManager.cpp @@ -202,6 +202,7 @@ void PixelShaderManager::SetConstants() SetPSConstant4f(C_FOG + 1, a, b, bpmem.fog.c_proj_fsel.GetC(), 0); s_bFogParamChanged = false; } + for (int i = 0; i < 8; i++) lastCustomTexScale[i][0] = lastCustomTexScale[i][1] = 1.0f; } diff --git a/Source/Core/VideoCommon/Src/PixelShaderManager.h b/Source/Core/VideoCommon/Src/PixelShaderManager.h index 858c19a881..a8aa85f696 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderManager.h +++ b/Source/Core/VideoCommon/Src/PixelShaderManager.h @@ -55,4 +55,4 @@ public: }; -#endif +#endif // _PIXELSHADERMANAGER_H diff --git a/Source/Core/VideoCommon/Src/Profiler.cpp b/Source/Core/VideoCommon/Src/Profiler.cpp index d18c6a0ba9..750cc0091d 100644 --- a/Source/Core/VideoCommon/Src/Profiler.cpp +++ b/Source/Core/VideoCommon/Src/Profiler.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -77,7 +77,8 @@ struct DVPROFSTRUCT ~DVPROFSTRUCT() { std::list::iterator it = listpChild.begin(); - while (it != listpChild.end()) { + while (it != listpChild.end()) + { delete *it; *it = NULL; ++it; @@ -150,12 +151,14 @@ void DVProfRegister(const char *pname) // else add in a new profiler to the appropriate parent profiler DVPROFSTRUCT* pprof = NULL; - if (g_listCurTracking.size() > 0) { + if (g_listCurTracking.size() > 0) + { _assert_( g_listCurTracking.back().pprof != NULL ); g_listCurTracking.back().pprof->listpChild.push_back(new DVPROFSTRUCT()); pprof = g_listCurTracking.back().pprof->listpChild.back(); } - else { + else + { g_listProfilers.push_back(DVPROFSTRUCT()); pprof = &g_listProfilers.back(); } @@ -206,7 +209,9 @@ u64 DVProfWriteStruct(FILE* f, const DVPROFSTRUCT* p, int ident) fprintf(f, "%*s%s - ", ident, "", p->pname); std::list::const_iterator ittime = p->listTimes.begin(); u64 utime = 0; - while (ittime != p->listTimes.end()) { + + while (ittime != p->listTimes.end()) + { utime += ittime->dwTime; if (ittime->dwUserData) fprintf(f, "time: %d, user: 0x%8.8x", (u32)ittime->dwTime, ittime->dwUserData); @@ -217,7 +222,8 @@ u64 DVProfWriteStruct(FILE* f, const DVPROFSTRUCT* p, int ident) // yes this is necessary, maps have problems with constructors on their type std::map::iterator ittimes = mapAggregateTimes.find(p->pname); - if (ittimes == mapAggregateTimes.end()) { + if (ittimes == mapAggregateTimes.end()) + { ittimes = mapAggregateTimes.insert(std::map::value_type(p->pname, DVTIMEINFO())).first; ittimes->second.uExclusive = 0; ittimes->second.uInclusive = 0; @@ -230,14 +236,14 @@ u64 DVProfWriteStruct(FILE* f, const DVPROFSTRUCT* p, int ident) std::list::const_iterator itprof = p->listpChild.begin(); u64 uex = utime; - while (itprof != p->listpChild.end()) { + while (itprof != p->listpChild.end()) + { uex -= DVProfWriteStruct(f, *itprof, ident+4); ++itprof; } - if (uex > utime) { + if (uex > utime) uex = 0; - } ittimes->second.uExclusive += uex; return utime; @@ -252,7 +258,8 @@ void DVProfWrite(const char* pfilename, u32 frames) mapAggregateTimes.clear(); std::list::iterator it = g_listProfilers.begin(); - while (it != g_listProfilers.end() ) { + while (it != g_listProfilers.end() ) + { DVProfWriteStruct(f, &(*it), 0); ++it; } @@ -263,7 +270,8 @@ void DVProfWrite(const char* pfilename, u32 frames) u64 uTotal[2] = {0}; double fiTotalTime[2]; - for (iter = mapAggregateTimes.begin(); iter != mapAggregateTimes.end(); ++iter) { + for (iter = mapAggregateTimes.begin(); iter != mapAggregateTimes.end(); ++iter) + { uTotal[0] += iter->second.uExclusive; uTotal[1] += iter->second.uInclusive; } @@ -275,10 +283,9 @@ void DVProfWrite(const char* pfilename, u32 frames) fiTotalTime[1] = 1.0 / (double)uTotal[1]; // output the combined times - for (iter = mapAggregateTimes.begin(); iter != mapAggregateTimes.end(); ++iter) { + for (iter = mapAggregateTimes.begin(); iter != mapAggregateTimes.end(); ++iter) fprintf(f, "%s - ex: %f inc: %f\n", iter->first.c_str(), (float)((double)iter->second.uExclusive * fiTotalTime[0]), (float)((double)iter->second.uInclusive * fiTotalTime[1])); - } fclose(f); } diff --git a/Source/Core/VideoCommon/Src/Profiler.h b/Source/Core/VideoCommon/Src/Profiler.h index 30cbbd8ead..a598c11568 100644 --- a/Source/Core/VideoCommon/Src/Profiler.h +++ b/Source/Core/VideoCommon/Src/Profiler.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -73,6 +73,6 @@ public: ~DVProfileFunc() {} }; -#endif +#endif // DVPROFILE && WIN32 -#endif +#endif // _PROFILER_H diff --git a/Source/Core/VideoCommon/Src/Statistics.cpp b/Source/Core/VideoCommon/Src/Statistics.cpp index b686195e39..a56f5e84e4 100644 --- a/Source/Core/VideoCommon/Src/Statistics.cpp +++ b/Source/Core/VideoCommon/Src/Statistics.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/Statistics.h b/Source/Core/VideoCommon/Src/Statistics.h index eb9e284121..9c81ec5454 100644 --- a/Source/Core/VideoCommon/Src/Statistics.h +++ b/Source/Core/VideoCommon/Src/Statistics.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/TextureDecoder.cpp b/Source/Core/VideoCommon/Src/TextureDecoder.cpp index 22902a13b5..eb0b84318b 100644 --- a/Source/Core/VideoCommon/Src/TextureDecoder.cpp +++ b/Source/Core/VideoCommon/Src/TextureDecoder.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -95,7 +95,8 @@ u32 TexDecoder_GetSafeTextureHash(const u8 *src, int width, int height, int texf int TexDecoder_GetBlockWidthInTexels(int format) { - switch (format) { + switch (format) + { case GX_TF_I4: return 8; case GX_TF_I8: return 8; case GX_TF_IA4: return 8; @@ -114,7 +115,8 @@ int TexDecoder_GetBlockWidthInTexels(int format) // FIXME: Use reasonable values for block height int TexDecoder_GetBlockHeightInTexels(int format) { - switch (format) { + /*switch (format) + { case GX_TF_I4: return 1; case GX_TF_I8: return 1; case GX_TF_IA4: return 1; @@ -127,16 +129,22 @@ int TexDecoder_GetBlockHeightInTexels(int format) case GX_TF_C14X2: return 1; case GX_TF_CMPR: return 8; default: return 1; - } + }*/ + + // Omega: I asssume the height would be the same as the width since it says 'block' + // width values look better than 1 anyways + // TODO: Confirm this + return TexDecoder_GetBlockWidthInTexels(format); } //returns bytes int TexDecoder_GetPaletteSize(int format) { - switch (format) { - case GX_TF_C4: return 16*2; - case GX_TF_C8: return 256*2; - case GX_TF_C14X2: return 16384*2; + switch (format) + { + case GX_TF_C4: return 16 * 2; + case GX_TF_C8: return 256 * 2; + case GX_TF_C14X2: return 16384 * 2; default: return 0; } @@ -149,34 +157,34 @@ inline u32 decode565(u16 val) g=lut6to8[(val>>5 ) & 0x3f]; b=lut5to8[(val ) & 0x1f]; a=0xFF; - return (a<<24) | (r<<16) | (g<<8) | b; + return (a << 24) | (r << 16) | (g << 8) | b; } inline u32 decodeIA8(u16 val) { int a = val >> 8; int i = val & 0xFF; - return (a<<24) | (i<<16) | (i<<8) | i; + return (a << 24) | (i << 16) | (i << 8) | i; } inline u32 decode5A3(u16 val) { int r,g,b,a; - if ((val&0x8000)) + if ((val & 0x8000)) { - r=lut5to8[(val>>10) & 0x1f]; - g=lut5to8[(val>>5 ) & 0x1f]; - b=lut5to8[(val ) & 0x1f]; + r=lut5to8[(val >> 10) & 0x1f]; + g=lut5to8[(val >> 5 ) & 0x1f]; + b=lut5to8[(val ) & 0x1f]; a=0xFF; } else { - a=lut3to8[(val>>12) & 0x7]; - r=lut4to8[(val>>8 ) & 0xf]; - g=lut4to8[(val>>4 ) & 0xf]; - b=lut4to8[(val ) & 0xf]; + a=lut3to8[(val >> 12) & 0x7]; + r=lut4to8[(val >> 8 ) & 0xf]; + g=lut4to8[(val >> 4 ) & 0xf]; + b=lut4to8[(val ) & 0xf]; } - return (a<<24) | (r<<16) | (g<<8) | b; + return (a << 24) | (r << 16) | (g << 8) | b; } struct DXTBlock @@ -212,7 +220,7 @@ inline void decodebytesC4_To_Raw16(u16* dst, const u8* src, int tlutaddr) //inline void decodebytesC8(u32 *dst, const u8 *src, int numbytes, int tlutaddr, int tlutfmt) inline void decodebytesC8_5A3_To_BGRA32(u32 *dst, const u8 *src, int tlutaddr) { - u16 *tlut = (u16*)(texMem+tlutaddr); + u16 *tlut = (u16*)(texMem + tlutaddr); for (int x = 0; x < 8; x++) { u8 val = src[x]; @@ -222,7 +230,7 @@ inline void decodebytesC8_5A3_To_BGRA32(u32 *dst, const u8 *src, int tlutaddr) inline void decodebytesC8_To_Raw16(u16* dst, const u8* src, int tlutaddr) { - u16* tlut = (u16*)(texMem+tlutaddr); + u16* tlut = (u16*)(texMem + tlutaddr); for (int x = 0; x < 8; x++) { u8 val = src[x]; @@ -234,21 +242,21 @@ inline void decodebytesC8_To_Raw16(u16* dst, const u8* src, int tlutaddr) //inline void decodebytesC14X2(u32 *dst, const u16 *src, int numpixels, int tlutaddr, int tlutfmt) inline void decodebytesC14X2_5A3_To_BGRA32(u32 *dst, const u16 *src, int tlutaddr) { - u16 *tlut = (u16*)(texMem+tlutaddr); + u16 *tlut = (u16*)(texMem + tlutaddr); for (int x = 0; x < 4; x++) { u16 val = Common::swap16(src[x]); - *dst++ = decode5A3(Common::swap16(tlut[(val&0x3FFF)])); + *dst++ = decode5A3(Common::swap16(tlut[(val & 0x3FFF)])); } } inline void decodebytesC14X2_To_Raw16(u16* dst, const u16* src, int tlutaddr) { - u16* tlut = (u16*)(texMem+tlutaddr); + u16* tlut = (u16*)(texMem + tlutaddr); for (int x = 0; x < 4; x++) { u16 val = Common::swap16(src[x]); - *dst++ = Common::swap16(tlut[(val&0x3FFF)]); + *dst++ = Common::swap16(tlut[(val & 0x3FFF)]); } } @@ -258,9 +266,9 @@ inline void decodebytesIA4(u16 *dst, const u8 *src) for (int x = 0; x < 8; x++) { const u8 val = src[x]; - const u8 a = lut4to8[val>>4]; - const u8 l = lut4to8[val&0xF]; - dst[x] = (a<<8) | l; + const u8 a = lut4to8[val >> 4]; + const u8 l = lut4to8[val & 0xF]; + dst[x] = (a << 8) | l; } } @@ -289,7 +297,7 @@ inline void decodebytesARGB8_4(u32 *dst, const u16 *src, const u16 *src2) inline u32 makecol(int r, int g, int b, int a) { - return (a<<24)|(r<<16)|(g<<8)|b; + return (a << 24)|(r << 16)|(g << 8)|b; } void decodeDXTBlock(u32 *dst, const DXTBlock *src, int pitch) @@ -310,14 +318,16 @@ void decodeDXTBlock(u32 *dst, const DXTBlock *src, int pitch) { colors[0] = makecol(red1, green1, blue1, 255); colors[1] = makecol(red2, green2, blue2, 255); - colors[2] = makecol(red1+(red2-red1)/3, green1+(green2-green1)/3, blue1+(blue2-blue1)/3, 255); - colors[3] = makecol(red2+(red1-red2)/3, green2+(green1-green2)/3, blue2+(blue1-blue2)/3, 255); + colors[2] = makecol(red1 + (red2 - red1) / 3, green1 + (green2 - green1) / 3, blue1 + (blue2 - blue1) / 3, 255); + colors[3] = makecol(red2 + (red1 - red2) / 3, green2 + (green1 - green2) / 3, blue2 + (blue1 - blue2) / 3, 255); } else { colors[0] = makecol(red1, green1, blue1, 255); // Color 1 colors[1] = makecol(red2, green2, blue2, 255); // Color 2 - colors[2] = makecol((int)ceil((float)(red1+red2)/2), (int)ceil((float)(green1+green2)/2), (int)ceil((float)(blue1+blue2)/2), 255); // Average + colors[2] = makecol((int)ceil((float)(red1 + red2) / 2), // Average + (int)ceil((float)(green1 + green2) / 2), + (int)ceil((float)(blue1 + blue2) / 2), 255); colors[3] = makecol(red2, green2, blue2, 0); // Color2 but transparent } @@ -374,14 +384,14 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh for (int y = 0; y < height; y += 8) for (int x = 0; x < width; x += 8) for (int iy = 0; iy < 8; iy++, src += 4) - decodebytesC4_5A3_To_BGRA32((u32*)dst+(y+iy)*width+x, src, tlutaddr); + decodebytesC4_5A3_To_BGRA32((u32*)dst + (y + iy) * width + x, src, tlutaddr); } else { for (int y = 0; y < height; y += 8) for (int x = 0; x < width; x += 8) for (int iy = 0; iy < 8; iy++, src += 4) - decodebytesC4_To_Raw16((u16*)dst+(y+iy)*width+x, src, tlutaddr); + decodebytesC4_To_Raw16((u16*)dst + (y + iy) * width + x, src, tlutaddr); } return GetPCFormatFromTLUTFormat(tlutfmt); case GX_TF_I4: @@ -392,8 +402,8 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh for (int ix = 0; ix < 4; ix++) { int val = src[ix]; - dst[(y+iy)*width+x+ix*2] = lut4to8[val>>4]; - dst[(y+iy)*width+x+ix*2+1] = lut4to8[val&15]; + dst[(y + iy) * width + x + ix * 2] = lut4to8[val >> 4]; + dst[(y + iy) * width + x + ix * 2 + 1] = lut4to8[val & 15]; } } return PC_TEX_FMT_I4_AS_I8; @@ -402,7 +412,7 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh for (int y = 0; y < height; y += 4) for (int x = 0; x < width; x += 8) for (int iy = 0; iy < 4; iy++, src += 8) - memcpy(dst+(y+iy)*width+x, src, 8); + memcpy(dst + (y + iy)*width+x, src, 8); } return PC_TEX_FMT_I8; case GX_TF_C8: @@ -412,23 +422,24 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh for (int y = 0; y < height; y += 4) for (int x = 0; x < width; x += 8) for (int iy = 0; iy < 4; iy++, src += 8) - decodebytesC8_5A3_To_BGRA32((u32*)dst+(y+iy)*width+x, src, tlutaddr); + decodebytesC8_5A3_To_BGRA32((u32*)dst + (y + iy) * width + x, src, tlutaddr); } else { for (int y = 0; y < height; y += 4) for (int x = 0; x < width; x += 8) for (int iy = 0; iy < 4; iy++, src += 8) - decodebytesC8_To_Raw16((u16*)dst+(y+iy)*width+x, src, tlutaddr); + decodebytesC8_To_Raw16((u16*)dst + (y + iy) * width + x, src, tlutaddr); } return GetPCFormatFromTLUTFormat(tlutfmt); case GX_TF_IA4: { for (int y = 0; y < height; y += 4) for (int x = 0; x < width; x += 8) - for (int iy = 0; iy < 4; iy++, src += 8) { + for (int iy = 0; iy < 4; iy++, src += 8) + { //decodebytesIA4((u32*)dst+(y+iy)*width+x, src, 8); - decodebytesIA4((u16*)dst+(y+iy)*width+x, src); + decodebytesIA4((u16*)dst + (y + iy) * width + x, src); } } return PC_TEX_FMT_IA4_AS_IA8; @@ -436,8 +447,9 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh { for (int y = 0; y < height; y += 4) for (int x = 0; x < width; x += 4) - for (int iy = 0; iy < 4; iy++, src += 8) { - u16 *ptr = (u16 *)dst+(y+iy)*width+x; + for (int iy = 0; iy < 4; iy++, src += 8) + { + u16 *ptr = (u16 *)dst + (y + iy) * width + x; u16 *s = (u16 *)src; for(int j = 0; j < 4; j++) *ptr++ = Common::swap16(*s++); @@ -452,22 +464,23 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh for (int y = 0; y < height; y += 4) for (int x = 0; x < width; x += 4) for (int iy = 0; iy < 4; iy++, src += 8) - decodebytesC14X2_5A3_To_BGRA32((u32*)dst+(y+iy)*width+x, (u16*)src, tlutaddr); + decodebytesC14X2_5A3_To_BGRA32((u32*)dst + (y + iy) * width + x, (u16*)src, tlutaddr); } else { for (int y = 0; y < height; y += 4) for (int x = 0; x < width; x += 4) for (int iy = 0; iy < 4; iy++, src += 8) - decodebytesC14X2_To_Raw16((u16*)dst+(y+iy)*width+x, (u16*)src, tlutaddr); + decodebytesC14X2_To_Raw16((u16*)dst + (y + iy) * width + x, (u16*)src, tlutaddr); } return GetPCFormatFromTLUTFormat(tlutfmt); case GX_TF_RGB565: { for (int y = 0; y < height; y += 4) for (int x = 0; x < width; x += 4) - for (int iy = 0; iy < 4; iy++, src += 8) { - u16 *ptr = (u16 *)dst+(y+iy)*width+x; + for (int iy = 0; iy < 4; iy++, src += 8) + { + u16 *ptr = (u16 *)dst + (y + iy) * width + x; u16 *s = (u16 *)src; for(int j = 0; j < 4; j++) *ptr++ = Common::swap16(*s++); @@ -485,15 +498,13 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh return PC_TEX_FMT_BGRA32; case GX_TF_RGBA8: // speed critical { - for (int y = 0; y < height; y += 4) { + for (int y = 0; y < height; y += 4) for (int x = 0; x < width; x += 4) { - for (int iy = 0; iy < 4; iy++) { + for (int iy = 0; iy < 4; iy++) decodebytesARGB8_4((u32*)dst + (y+iy)*width + x, (u16*)src + 4 * iy, (u16*)src + 4 * iy + 16); - } src += 64; } - } } return PC_TEX_FMT_BGRA32; case GX_TF_CMPR: // speed critical @@ -522,13 +533,13 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh { for (int x = 0; x < width; x += 8) { - decodeDXTBlock((u32*)dst+y*width+x, (DXTBlock*)src, width); + decodeDXTBlock((u32*)dst + y * width + x, (DXTBlock*)src, width); src += sizeof(DXTBlock); - decodeDXTBlock((u32*)dst+y*width+x+4, (DXTBlock*)src, width); + decodeDXTBlock((u32*)dst + y * width + x + 4, (DXTBlock*)src, width); src += sizeof(DXTBlock); - decodeDXTBlock((u32*)dst+(y+4)*width+x, (DXTBlock*)src, width); + decodeDXTBlock((u32*)dst + (y + 4) * width + x, (DXTBlock*)src, width); src += sizeof(DXTBlock); - decodeDXTBlock((u32*)dst+(y+4)*width+x+4, (DXTBlock*)src, width); + decodeDXTBlock((u32*)dst + (y + 4) * width + x + 4, (DXTBlock*)src, width); src += sizeof(DXTBlock); } } @@ -550,14 +561,14 @@ void TexDecoder_SetTexFmtOverlayOptions(bool enable, bool center) PC_TexFormat TexDecoder_Decode(u8 *dst, const u8 *src, int width, int height, int texformat, int tlutaddr, int tlutfmt) { PC_TexFormat retval = TexDecoder_Decode_real(dst,src,width,height,texformat,tlutaddr,tlutfmt); - if ((!TexFmt_Overlay_Enable)||(retval==PC_TEX_FMT_NONE)) + if ((!TexFmt_Overlay_Enable)|| (retval == PC_TEX_FMT_NONE)) return retval; - int w = min(width,40); - int h = min(height,10); + int w = min(width, 40); + int h = min(height, 10); - int xoff = (width-w)>>1; - int yoff = (height-h)>>1; + int xoff = (width - w) >> 1; + int yoff = (height - h) >> 1; if (!TexFmt_Overlay_Center) { @@ -579,43 +590,44 @@ PC_TexFormat TexDecoder_Decode(u8 *dst, const u8 *src, int width, int height, in break; xcnt++; } - for(int y=0;y<10;y++) + for(int y=0; y < 10; y++) { - for(int x=0;x g_VideoInitialize.pBBox[1]) g_VideoInitialize.pBBox[1] = std::min(640.0f, o[0]); - if (o[1] < g_VideoInitialize.pBBox[2]) g_VideoInitialize.pBBox[2] = std::max(0.0f, o[1]); - if (o[1] > g_VideoInitialize.pBBox[3]) g_VideoInitialize.pBBox[3] = std::min(480.0f, o[1]); + if (o[0] < g_VideoInitialize.pBBox[0]) g_VideoInitialize.pBBox[0] = (u16)std::max(0.0f, o[0]); + if (o[0] > g_VideoInitialize.pBBox[1]) g_VideoInitialize.pBBox[1] = (u16)std::min(640.0f, o[0]); + if (o[1] < g_VideoInitialize.pBBox[2]) g_VideoInitialize.pBBox[2] = (u16)std::max(0.0f, o[1]); + if (o[1] > g_VideoInitialize.pBBox[3]) g_VideoInitialize.pBBox[3] = (u16)std::min(480.0f, o[1]); /* if (GetAsyncKeyState(VK_LSHIFT)) { ERROR_LOG(VIDEO, "XForm: %f %f %f to %f %f", p[0], p[1], p[2], o[0], o[1]); diff --git a/Source/Core/VideoCommon/Src/VertexLoaderManager.cpp b/Source/Core/VideoCommon/Src/VertexLoaderManager.cpp index 9dca94111b..2c67e8e083 100644 --- a/Source/Core/VideoCommon/Src/VertexLoaderManager.cpp +++ b/Source/Core/VideoCommon/Src/VertexLoaderManager.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp index 3208475ddf..4b7117fcc3 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp +++ b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/VertexShaderGen.h b/Source/Core/VideoCommon/Src/VertexShaderGen.h index 22a65ed0fa..db94a70bcd 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderGen.h +++ b/Source/Core/VideoCommon/Src/VertexShaderGen.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -21,30 +21,30 @@ #include "XFMemory.h" #define SHADER_POSMTX_ATTRIB 1 -#define SHADER_NORM1_ATTRIB 6 -#define SHADER_NORM2_ATTRIB 7 +#define SHADER_NORM1_ATTRIB 6 +#define SHADER_NORM2_ATTRIB 7 // shader variables -#define I_POSNORMALMATRIX "cpnmtx" -#define I_PROJECTION "cproj" -#define I_MATERIALS "cmtrl" -#define I_LIGHTS "clights" -#define I_TEXMATRICES "ctexmtx" -#define I_TRANSFORMMATRICES "ctrmtx" -#define I_NORMALMATRICES "cnmtx" +#define I_POSNORMALMATRIX "cpnmtx" +#define I_PROJECTION "cproj" +#define I_MATERIALS "cmtrl" +#define I_LIGHTS "clights" +#define I_TEXMATRICES "ctexmtx" +#define I_TRANSFORMMATRICES "ctrmtx" +#define I_NORMALMATRICES "cnmtx" #define I_POSTTRANSFORMMATRICES "cpostmtx" -#define I_FOGPARAMS "cfog" +#define I_FOGPARAMS "cfog" -#define C_POSNORMALMATRIX 0 -#define C_PROJECTION (C_POSNORMALMATRIX+6) -#define C_MATERIALS (C_PROJECTION+4) -#define C_LIGHTS (C_MATERIALS+4) -#define C_TEXMATRICES (C_LIGHTS+40) -#define C_TRANSFORMMATRICES (C_TEXMATRICES+24) -#define C_NORMALMATRICES (C_TRANSFORMMATRICES+64) -#define C_POSTTRANSFORMMATRICES (C_NORMALMATRICES+32) -#define C_FOGPARAMS (C_POSTTRANSFORMMATRICES+64) +#define C_POSNORMALMATRIX 0 +#define C_PROJECTION (C_POSNORMALMATRIX + 6) +#define C_MATERIALS (C_PROJECTION + 4) +#define C_LIGHTS (C_MATERIALS + 4) +#define C_TEXMATRICES (C_LIGHTS + 40) +#define C_TRANSFORMMATRICES (C_TEXMATRICES + 24) +#define C_NORMALMATRICES (C_TRANSFORMMATRICES + 64) +#define C_POSTTRANSFORMMATRICES (C_NORMALMATRICES + 32) +#define C_FOGPARAMS (C_POSTTRANSFORMMATRICES + 64) class VERTEXSHADERUID @@ -52,17 +52,20 @@ class VERTEXSHADERUID public: u32 values[9]; - VERTEXSHADERUID() { + VERTEXSHADERUID() + { memset(values, 0, sizeof(values)); } - VERTEXSHADERUID(const VERTEXSHADERUID& r) { + VERTEXSHADERUID(const VERTEXSHADERUID& r) + { for (size_t i = 0; i < sizeof(values) / sizeof(u32); ++i) values[i] = r.values[i]; } - int GetNumValues() const { - return (((values[0] >> 23) & 0xf)*3 + 3)/4 + 3; // numTexGens*3/4+1 + int GetNumValues() const + { + return (((values[0] >> 23) & 0xf) * 3 + 3) / 4 + 3; // numTexGens*3/4+1 } bool operator <(const VERTEXSHADERUID& _Right) const @@ -72,7 +75,8 @@ public: else if (values[0] > _Right.values[0]) return false; int N = GetNumValues(); - for (int i = 1; i < N; ++i) { + for (int i = 1; i < N; ++i) + { if (values[i] < _Right.values[i]) return true; else if (values[i] > _Right.values[i]) @@ -86,7 +90,8 @@ public: if (values[0] != _Right.values[0]) return false; int N = GetNumValues(); - for (int i = 1; i < N; ++i) { + for (int i = 1; i < N; ++i) + { if (values[i] != _Right.values[i]) return false; } @@ -97,4 +102,4 @@ public: const char *GenerateVertexShader(u32 components); void GetVertexShaderId(VERTEXSHADERUID& vid, u32 components); -#endif +#endif // GCOGL_VERTEXSHADER_H diff --git a/Source/Core/VideoCommon/Src/VertexShaderManager.cpp b/Source/Core/VideoCommon/Src/VertexShaderManager.cpp index fb46200404..8c127564b1 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderManager.cpp +++ b/Source/Core/VideoCommon/Src/VertexShaderManager.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -72,14 +72,13 @@ void VertexShaderManager::Init() void VertexShaderManager::Shutdown() { - } - -// ======================================================================================= // Syncs the shader constant buffers with xfmem -// ---------------- +// TODO: A cleaner way to control the matricies without making a mess in the parameters field void VertexShaderManager::SetConstants(bool proj_hax_1,bool Hack_hack1 ,float Hack_value1 ,bool Hack_hack2 ,float Hack_value2 ,bool freeLook) { + + // TODO: Is this still needed? //nTransformMatricesChanged[0] = 0; nTransformMatricesChanged[1] = 256; //nNormalMatricesChanged[0] = 0; nNormalMatricesChanged[1] = 96; //nPostTransformMatricesChanged[0] = 0; nPostTransformMatricesChanged[1] = 256; @@ -87,55 +86,63 @@ void VertexShaderManager::SetConstants(bool proj_hax_1,bool Hack_hack1 ,float Ha //bPosNormalMatrixChanged = true; //bTexMatricesChanged[0] = bTexMatricesChanged[1] = true; //bProjectionChanged = true; -// bPosNormalMatrixChanged = bTexMatricesChanged[0] = bTexMatricesChanged[1] = true; -// nMaterialsChanged = 15; + //bPosNormalMatrixChanged = bTexMatricesChanged[0] = bTexMatricesChanged[1] = true; + //nMaterialsChanged = 15; - if (nTransformMatricesChanged[0] >= 0) { - int startn = nTransformMatricesChanged[0]/4; - int endn = (nTransformMatricesChanged[1]+3)/4; - const float* pstart = (const float*)&xfmem[startn*4]; + if (nTransformMatricesChanged[0] >= 0) + { + int startn = nTransformMatricesChanged[0] / 4; + int endn = (nTransformMatricesChanged[1] + 3) / 4; + const float* pstart = (const float*)&xfmem[startn * 4]; for(int i = startn; i < endn; ++i, pstart += 4) - SetVSConstant4fv(C_TRANSFORMMATRICES+i, pstart); + SetVSConstant4fv(C_TRANSFORMMATRICES + i, pstart); nTransformMatricesChanged[0] = nTransformMatricesChanged[1] = -1; } - if (nNormalMatricesChanged[0] >= 0) { - int startn = nNormalMatricesChanged[0]/3; - int endn = (nNormalMatricesChanged[1]+2)/3; + if (nNormalMatricesChanged[0] >= 0) + { + int startn = nNormalMatricesChanged[0] / 3; + int endn = (nNormalMatricesChanged[1] + 2) / 3; const float* pnstart = (const float*)&xfmem[XFMEM_NORMALMATRICES+3*startn]; for(int i = startn; i < endn; ++i, pnstart += 3) - SetVSConstant4fv(C_NORMALMATRICES+i, pnstart); + SetVSConstant4fv(C_NORMALMATRICES + i, pnstart); nNormalMatricesChanged[0] = nNormalMatricesChanged[1] = -1; } - if (nPostTransformMatricesChanged[0] >= 0) { - int startn = nPostTransformMatricesChanged[0]/4; - int endn = (nPostTransformMatricesChanged[1]+3)/4; - const float* pstart = (const float*)&xfmem[XFMEM_POSTMATRICES + startn*4]; + if (nPostTransformMatricesChanged[0] >= 0) + { + int startn = nPostTransformMatricesChanged[0] / 4; + int endn = (nPostTransformMatricesChanged[1] + 3 ) / 4; + const float* pstart = (const float*)&xfmem[XFMEM_POSTMATRICES + startn * 4]; for(int i = startn; i < endn; ++i, pstart += 4) SetVSConstant4fv(C_POSTTRANSFORMMATRICES + i, pstart); } - if (nLightsChanged[0] >= 0) { + if (nLightsChanged[0] >= 0) + { // lights don't have a 1 to 1 mapping, the color component needs to be converted to 4 floats int istart = nLightsChanged[0] / 0x10; int iend = (nLightsChanged[1] + 15) / 0x10; - const float* xfmemptr = (const float*)&xfmem[0x10*istart + XFMEM_LIGHTS]; + const float* xfmemptr = (const float*)&xfmem[0x10 * istart + XFMEM_LIGHTS]; - for (int i = istart; i < iend; ++i) { + for (int i = istart; i < iend; ++i) + { u32 color = *(const u32*)(xfmemptr + 3); - SetVSConstant4f(C_LIGHTS + 5*i, - ((color >> 24) & 0xFF)/255.0f, - ((color >> 16) & 0xFF)/255.0f, - ((color >> 8) & 0xFF)/255.0f, - ((color) & 0xFF)/255.0f); + SetVSConstant4f(C_LIGHTS + 5 * i, + ((color >> 24) & 0xFF) / 255.0f, + ((color >> 16) & 0xFF) / 255.0f, + ((color >> 8) & 0xFF) / 255.0f, + ((color) & 0xFF) / 255.0f); xfmemptr += 4; - for (int j = 0; j < 4; ++j, xfmemptr += 3) { + + for (int j = 0; j < 4; ++j, xfmemptr += 3) + { if (j == 1 && fabs(xfmemptr[0]) < 0.00001f && fabs(xfmemptr[1]) < 0.00001f && - fabs(xfmemptr[2]) < 0.00001f) { + fabs(xfmemptr[2]) < 0.00001f) + { // dist attenuation, make sure not equal to 0!!! SetVSConstant4f(C_LIGHTS+5*i+j+1, 0.00001f, xfmemptr[1], xfmemptr[2], 0); } @@ -147,66 +154,78 @@ void VertexShaderManager::SetConstants(bool proj_hax_1,bool Hack_hack1 ,float Ha nLightsChanged[0] = nLightsChanged[1] = -1; } - if (nMaterialsChanged) { - for (int i = 0; i < 4; ++i) { + if (nMaterialsChanged) + { + for (int i = 0; i < 4; ++i) if (nMaterialsChanged & (1 << i)) - SetVSConstant4fv(C_MATERIALS + i, &s_fMaterials[4*i]); - } + SetVSConstant4fv(C_MATERIALS + i, &s_fMaterials[4 * i]); + nMaterialsChanged = 0; } - if (bPosNormalMatrixChanged) { + if (bPosNormalMatrixChanged) + { bPosNormalMatrixChanged = false; float* pos = (float*)xfmem + MatrixIndexA.PosNormalMtxIdx * 4; float* norm = (float*)xfmem + XFMEM_NORMALMATRICES + 3 * (MatrixIndexA.PosNormalMtxIdx & 31); SetVSConstant4fv(C_POSNORMALMATRIX, pos); - SetVSConstant4fv(C_POSNORMALMATRIX+1, pos+4); - SetVSConstant4fv(C_POSNORMALMATRIX+2, pos+8); + SetVSConstant4fv(C_POSNORMALMATRIX+1, pos + 4); + SetVSConstant4fv(C_POSNORMALMATRIX+2, pos + 8); SetVSConstant4fv(C_POSNORMALMATRIX+3, norm); - SetVSConstant4fv(C_POSNORMALMATRIX+4, norm+3); - SetVSConstant4fv(C_POSNORMALMATRIX+5, norm+6); + SetVSConstant4fv(C_POSNORMALMATRIX+4, norm + 3); + SetVSConstant4fv(C_POSNORMALMATRIX+5, norm + 6); } - if (bTexMatricesChanged[0]) { + if (bTexMatricesChanged[0]) + { bTexMatricesChanged[0] = false; - float* fptrs[] = { + + float* fptrs[] = + { (float*)xfmem + MatrixIndexA.Tex0MtxIdx * 4, (float*)xfmem + MatrixIndexA.Tex1MtxIdx * 4, (float*)xfmem + MatrixIndexA.Tex2MtxIdx * 4, (float*)xfmem + MatrixIndexA.Tex3MtxIdx * 4 }; - for (int i = 0; i < 4; ++i) { - SetVSConstant4fv(C_TEXMATRICES+3*i, fptrs[i]); - SetVSConstant4fv(C_TEXMATRICES+3*i+1, fptrs[i]+4); - SetVSConstant4fv(C_TEXMATRICES+3*i+2, fptrs[i]+8); + for (int i = 0; i < 4; ++i) + { + SetVSConstant4fv(C_TEXMATRICES+3 * i, fptrs[i]); + SetVSConstant4fv(C_TEXMATRICES+3 * i + 1, fptrs[i] + 4); + SetVSConstant4fv(C_TEXMATRICES+3 * i + 2, fptrs[i] + 8); } } - if (bTexMatricesChanged[1]) { + if (bTexMatricesChanged[1]) + { bTexMatricesChanged[1] = false; float* fptrs[] = {(float*)xfmem + MatrixIndexB.Tex4MtxIdx * 4, (float*)xfmem + MatrixIndexB.Tex5MtxIdx * 4, (float*)xfmem + MatrixIndexB.Tex6MtxIdx * 4, (float*)xfmem + MatrixIndexB.Tex7MtxIdx * 4 }; - for (int i = 0; i < 4; ++i) { - SetVSConstant4fv(C_TEXMATRICES+3*i+12, fptrs[i]); - SetVSConstant4fv(C_TEXMATRICES+3*i+12+1, fptrs[i]+4); - SetVSConstant4fv(C_TEXMATRICES+3*i+12+2, fptrs[i]+8); + for (int i = 0; i < 4; ++i) + { + SetVSConstant4fv(C_TEXMATRICES+3 * i + 12, fptrs[i]); + SetVSConstant4fv(C_TEXMATRICES+3 * i + 12 + 1, fptrs[i] + 4); + SetVSConstant4fv(C_TEXMATRICES+3 * i + 12 + 2, fptrs[i] + 8); } } - if (bViewportChanged) { + if (bViewportChanged) + { bViewportChanged = false; // This is so implementation-dependent that we can't have it here. UpdateViewport(); } - if (bProjectionChanged) { + if (bProjectionChanged) + { bProjectionChanged = false; - if (xfregs.rawProjection[6] == 0) { // Perspective + if (xfregs.rawProjection[6] == 0) + { + // Perspective g_fProjectionMatrix[0] = xfregs.rawProjection[0]; g_fProjectionMatrix[1] = 0.0f; g_fProjectionMatrix[2] = xfregs.rawProjection[1]; @@ -247,7 +266,9 @@ void VertexShaderManager::SetConstants(bool proj_hax_1,bool Hack_hack1 ,float Ha SETSTAT_FT(stats.gproj_14, g_fProjectionMatrix[14]); SETSTAT_FT(stats.gproj_15, g_fProjectionMatrix[15]); } - else { // Orthographic Projection + else + { + // Orthographic Projection g_fProjectionMatrix[0] = xfregs.rawProjection[0]; g_fProjectionMatrix[1] = 0.0f; g_fProjectionMatrix[2] = 0.0f; @@ -295,7 +316,8 @@ void VertexShaderManager::SetConstants(bool proj_hax_1,bool Hack_hack1 ,float Ha PRIM_LOG("Projection: %f %f %f %f %f %f\n", xfregs.rawProjection[0], xfregs.rawProjection[1], xfregs.rawProjection[2], xfregs.rawProjection[3], xfregs.rawProjection[4], xfregs.rawProjection[5]); - if (freeLook) { + if (freeLook) + { Matrix44 mtxA; Matrix44 mtxB; Matrix44 viewMtx; @@ -311,7 +333,8 @@ void VertexShaderManager::SetConstants(bool proj_hax_1,bool Hack_hack1 ,float Ha SetVSConstant4fv(C_PROJECTION+2, &mtxA.data[8]); SetVSConstant4fv(C_PROJECTION+3, &mtxA.data[12]); } - else { + else + { SetVSConstant4fv(C_PROJECTION, &g_fProjectionMatrix[0]); SetVSConstant4fv(C_PROJECTION+1, &g_fProjectionMatrix[4]); SetVSConstant4fv(C_PROJECTION+2, &g_fProjectionMatrix[8]); @@ -322,10 +345,10 @@ void VertexShaderManager::SetConstants(bool proj_hax_1,bool Hack_hack1 ,float Ha void VertexShaderManager::InvalidateXFRange(int start, int end) { - if (((u32)start >= (u32)MatrixIndexA.PosNormalMtxIdx*4 && - (u32)start < (u32)MatrixIndexA.PosNormalMtxIdx*4 + 12) || - ((u32)start >= XFMEM_NORMALMATRICES + ((u32)MatrixIndexA.PosNormalMtxIdx & 31)*3 && - (u32)start < XFMEM_NORMALMATRICES + ((u32)MatrixIndexA.PosNormalMtxIdx & 31)*3 + 9)) { + if (((u32)start >= (u32)MatrixIndexA.PosNormalMtxIdx * 4 && + (u32)start < (u32)MatrixIndexA.PosNormalMtxIdx * 4 + 12) || + ((u32)start >= XFMEM_NORMALMATRICES + ((u32)MatrixIndexA.PosNormalMtxIdx & 31) * 3 && + (u32)start < XFMEM_NORMALMATRICES + ((u32)MatrixIndexA.PosNormalMtxIdx & 31) * 3 + 9)) { bPosNormalMatrixChanged = true; } @@ -343,54 +366,66 @@ void VertexShaderManager::InvalidateXFRange(int start, int end) bTexMatricesChanged[1] = true; } - if (start < XFMEM_POSMATRICES_END) { - if (nTransformMatricesChanged[0] == -1) { + if (start < XFMEM_POSMATRICES_END) + { + if (nTransformMatricesChanged[0] == -1) + { nTransformMatricesChanged[0] = start; nTransformMatricesChanged[1] = end>XFMEM_POSMATRICES_END?XFMEM_POSMATRICES_END:end; } - else { + else + { if (nTransformMatricesChanged[0] > start) nTransformMatricesChanged[0] = start; if (nTransformMatricesChanged[1] < end) nTransformMatricesChanged[1] = end>XFMEM_POSMATRICES_END?XFMEM_POSMATRICES_END:end; } } - if (start < XFMEM_NORMALMATRICES_END && end > XFMEM_NORMALMATRICES) { + if (start < XFMEM_NORMALMATRICES_END && end > XFMEM_NORMALMATRICES) + { int _start = start < XFMEM_NORMALMATRICES ? 0 : start-XFMEM_NORMALMATRICES; int _end = end < XFMEM_NORMALMATRICES_END ? end-XFMEM_NORMALMATRICES : XFMEM_NORMALMATRICES_END-XFMEM_NORMALMATRICES; - if (nNormalMatricesChanged[0] == -1 ) { + if (nNormalMatricesChanged[0] == -1) + { nNormalMatricesChanged[0] = _start; nNormalMatricesChanged[1] = _end; } - else { + else + { if (nNormalMatricesChanged[0] > _start) nNormalMatricesChanged[0] = _start; if (nNormalMatricesChanged[1] < _end) nNormalMatricesChanged[1] = _end; } } - if (start < XFMEM_POSTMATRICES_END && end > XFMEM_POSTMATRICES) { + if (start < XFMEM_POSTMATRICES_END && end > XFMEM_POSTMATRICES) + { int _start = start < XFMEM_POSTMATRICES ? XFMEM_POSTMATRICES : start-XFMEM_POSTMATRICES; int _end = end < XFMEM_POSTMATRICES_END ? end-XFMEM_POSTMATRICES : XFMEM_POSTMATRICES_END-XFMEM_POSTMATRICES; - if (nPostTransformMatricesChanged[0] == -1 ) { + if (nPostTransformMatricesChanged[0] == -1) + { nPostTransformMatricesChanged[0] = _start; nPostTransformMatricesChanged[1] = _end; } - else { + else + { if (nPostTransformMatricesChanged[0] > _start) nPostTransformMatricesChanged[0] = _start; if (nPostTransformMatricesChanged[1] < _end) nPostTransformMatricesChanged[1] = _end; } } - if (start < XFMEM_LIGHTS_END && end > XFMEM_LIGHTS) { + if (start < XFMEM_LIGHTS_END && end > XFMEM_LIGHTS) + { int _start = start < XFMEM_LIGHTS ? XFMEM_LIGHTS : start-XFMEM_LIGHTS; int _end = end < XFMEM_LIGHTS_END ? end-XFMEM_LIGHTS : XFMEM_LIGHTS_END-XFMEM_LIGHTS; - if (nLightsChanged[0] == -1 ) { + if (nLightsChanged[0] == -1 ) + { nLightsChanged[0] = _start; nLightsChanged[1] = _end; } - else { + else + { if (nLightsChanged[0] > _start) nLightsChanged[0] = _start; if (nLightsChanged[1] < _end) nLightsChanged[1] = _end; } @@ -399,7 +434,8 @@ void VertexShaderManager::InvalidateXFRange(int start, int end) void VertexShaderManager::SetTexMatrixChangedA(u32 Value) { - if (MatrixIndexA.Hex != Value) { + if (MatrixIndexA.Hex != Value) + { VertexManager::Flush(); if (MatrixIndexA.PosNormalMtxIdx != (Value&0x3f)) bPosNormalMatrixChanged = true; @@ -410,7 +446,8 @@ void VertexShaderManager::SetTexMatrixChangedA(u32 Value) void VertexShaderManager::SetTexMatrixChangedB(u32 Value) { - if (MatrixIndexB.Hex != Value) { + if (MatrixIndexB.Hex != Value) + { VertexManager::Flush(); bTexMatricesChanged[1] = true; MatrixIndexB.Hex = Value; @@ -420,7 +457,8 @@ void VertexShaderManager::SetTexMatrixChangedB(u32 Value) void VertexShaderManager::SetViewport(float* _Viewport) { // Workaround for paper mario, yep this is bizarre. - for (size_t i = 0; i < ARRAYSIZE(xfregs.rawViewport); ++i) { + for (size_t i = 0; i < ARRAYSIZE(xfregs.rawViewport); ++i) + { if (*(u32*)(_Viewport + i) == 0x7f800000) // invalid fp number return; } @@ -445,10 +483,10 @@ void VertexShaderManager::SetMaterialColor(int index, u32 data) nMaterialsChanged |= (1 << index); - s_fMaterials[ind++] = ((data>>24)&0xFF)/255.0f; - s_fMaterials[ind++] = ((data>>16)&0xFF)/255.0f; - s_fMaterials[ind++] = ((data>>8)&0xFF)/255.0f; - s_fMaterials[ind] = ((data)&0xFF)/255.0f; + s_fMaterials[ind++] = ((data >> 24) & 0xFF) / 255.0f; + s_fMaterials[ind++] = ((data >> 16) & 0xFF) / 255.0f; + s_fMaterials[ind++] = ((data >> 8) & 0xFF) / 255.0f; + s_fMaterials[ind] = ( data & 0xFF) / 255.0f; } void VertexShaderManager::TranslateView(float x, float y) @@ -458,9 +496,8 @@ void VertexShaderManager::TranslateView(float x, float y) Matrix33::Multiply(s_viewInvRotationMatrix, vector, result); - for(int i = 0; i < 3; i++) { + for(int i = 0; i < 3; i++) s_fViewTranslationVector[i] += result[i]; - } bProjectionChanged = true; } diff --git a/Source/Core/VideoCommon/Src/VertexShaderManager.h b/Source/Core/VideoCommon/Src/VertexShaderManager.h index b872fc9c5c..708a51b2cc 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderManager.h +++ b/Source/Core/VideoCommon/Src/VertexShaderManager.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -46,4 +46,4 @@ public: void SetVSConstant4f(int const_number, float f1, float f2, float f3, float f4); void SetVSConstant4fv(int const_number, const float *f); -#endif +#endif // _VERTEXSHADERMANAGER_H diff --git a/Source/Core/VideoCommon/Src/VideoState.cpp b/Source/Core/VideoCommon/Src/VideoState.cpp index 66f3611b9c..86f975a8a1 100644 --- a/Source/Core/VideoCommon/Src/VideoState.cpp +++ b/Source/Core/VideoCommon/Src/VideoState.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -45,7 +45,8 @@ static void DoState(PointerWrap &p) Fifo_DoState(p); } -void VideoCommon_DoState(PointerWrap &p) { +void VideoCommon_DoState(PointerWrap &p) +{ DoState(p); //TODO: search for more data that should be saved and add it here } diff --git a/Source/Core/VideoCommon/Src/VideoState.h b/Source/Core/VideoCommon/Src/VideoState.h index 28230f0021..0d8a72f392 100644 --- a/Source/Core/VideoCommon/Src/VideoState.h +++ b/Source/Core/VideoCommon/Src/VideoState.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -15,12 +15,12 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#ifndef __VIDEOSTATE_H -#define __VIDEOSTATE_H +#ifndef _VIDEOSTATE_H +#define _VIDEOSTATE_H #include "Common.h" #include "ChunkFile.h" void VideoCommon_DoState(PointerWrap &p); -#endif +#endif // _VIDEOSTATE_H diff --git a/Source/Core/VideoCommon/Src/XFBConvert.cpp b/Source/Core/VideoCommon/Src/XFBConvert.cpp index 2aff13c15e..58087bc190 100644 --- a/Source/Core/VideoCommon/Src/XFBConvert.cpp +++ b/Source/Core/VideoCommon/Src/XFBConvert.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/XFBConvert.h b/Source/Core/VideoCommon/Src/XFBConvert.h index a1b6a5704a..9e02632c62 100644 --- a/Source/Core/VideoCommon/Src/XFBConvert.h +++ b/Source/Core/VideoCommon/Src/XFBConvert.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/XFMemory.cpp b/Source/Core/VideoCommon/Src/XFMemory.cpp index 60c9c8811f..0184dc34f4 100644 --- a/Source/Core/VideoCommon/Src/XFMemory.cpp +++ b/Source/Core/VideoCommon/Src/XFMemory.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/Source/Core/VideoCommon/Src/XFMemory.h b/Source/Core/VideoCommon/Src/XFMemory.h index 21e3c1508d..53b82c11fa 100644 --- a/Source/Core/VideoCommon/Src/XFMemory.h +++ b/Source/Core/VideoCommon/Src/XFMemory.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -30,51 +30,28 @@ #define XF_TEXINPUT_AB11 0 #define XF_TEXINPUT_ABC1 1 -#define XF_TEXGEN_REGULAR 0 -#define XF_TEXGEN_EMBOSS_MAP 1 // used when bump mapping +#define XF_TEXGEN_REGULAR 0 +#define XF_TEXGEN_EMBOSS_MAP 1 // used when bump mapping #define XF_TEXGEN_COLOR_STRGBC0 2 #define XF_TEXGEN_COLOR_STRGBC1 3 -#define XF_SRCGEOM_INROW 0 // input is abc -#define XF_SRCNORMAL_INROW 1 // input is abc -#define XF_SRCCOLORS_INROW 2 +#define XF_SRCGEOM_INROW 0 // input is abc +#define XF_SRCNORMAL_INROW 1 // input is abc +#define XF_SRCCOLORS_INROW 2 #define XF_SRCBINORMAL_T_INROW 3 // input is abc #define XF_SRCBINORMAL_B_INROW 4 // input is abc -#define XF_SRCTEX0_INROW 5 -#define XF_SRCTEX1_INROW 6 -#define XF_SRCTEX2_INROW 7 -#define XF_SRCTEX3_INROW 8 -#define XF_SRCTEX4_INROW 9 -#define XF_SRCTEX5_INROW 10 -#define XF_SRCTEX6_INROW 11 -#define XF_SRCTEX7_INROW 12 +#define XF_SRCTEX0_INROW 5 +#define XF_SRCTEX1_INROW 6 +#define XF_SRCTEX2_INROW 7 +#define XF_SRCTEX3_INROW 8 +#define XF_SRCTEX4_INROW 9 +#define XF_SRCTEX5_INROW 10 +#define XF_SRCTEX6_INROW 11 +#define XF_SRCTEX7_INROW 12 #define GX_SRC_REG 0 #define GX_SRC_VTX 1 -struct Light -{ - u32 useless[3]; - u32 color; //rgba - float a0; //attenuation - float a1; - float a2; - float k0; //k stuff - float k1; - float k2; - union - { - struct { - float dpos[3]; - float ddir[3]; // specular lights only - }; - struct { - float sdir[3]; - float shalfangle[3]; // specular lights only - }; - }; -}; - #define LIGHTDIF_NONE 0 #define LIGHTDIF_SIGN 1 #define LIGHTDIF_CLAMP 2 @@ -82,7 +59,42 @@ struct Light #define LIGHTATTN_SPEC 0 // specular attenuation #define LIGHTATTN_SPOT 1 // distance/spotlight attenuation #define LIGHTATTN_NONE 2 -#define LIGHTATTN_DIR 3 +#define LIGHTATTN_DIR 3 + +#define XFMEM_SIZE 0x8000 +#define XFMEM_POSMATRICES 0x000 +#define XFMEM_POSMATRICES_END 0x100 +#define XFMEM_NORMALMATRICES 0x400 +#define XFMEM_NORMALMATRICES_END 0x460 +#define XFMEM_POSTMATRICES 0x500 +#define XFMEM_POSTMATRICES_END 0x600 +#define XFMEM_LIGHTS 0x600 +#define XFMEM_LIGHTS_END 0x680 +#define XFMEM_ERROR 0x1000 +#define XFMEM_DIAG 0x1001 +#define XFMEM_STATE0 0x1002 +#define XFMEM_STATE1 0x1003 +#define XFMEM_CLOCK 0x1004 +#define XFMEM_CLIPDISABLE 0x1005 +#define XFMEM_SETGPMETRIC 0x1006 +#define XFMEM_VTXSPECS 0x1008 +#define XFMEM_SETNUMCHAN 0x1009 +#define XFMEM_SETCHAN0_AMBCOLOR 0x100a +#define XFMEM_SETCHAN1_AMBCOLOR 0x100b +#define XFMEM_SETCHAN0_MATCOLOR 0x100c +#define XFMEM_SETCHAN1_MATCOLOR 0x100d +#define XFMEM_SETCHAN0_COLOR 0x100e +#define XFMEM_SETCHAN1_COLOR 0x100f +#define XFMEM_SETCHAN0_ALPHA 0x1010 +#define XFMEM_SETCHAN1_ALPHA 0x1011 +#define XFMEM_DUALTEX 0x1012 +#define XFMEM_SETMATRIXINDA 0x1018 +#define XFMEM_SETMATRIXINDB 0x1019 +#define XFMEM_SETVIEWPORT 0x101a +#define XFMEM_SETPROJECTION 0x1020 +#define XFMEM_SETNUMTEXGENS 0x103f +#define XFMEM_SETTEXMTXINFO 0x1040 +#define XFMEM_SETPOSMTXINFO 0x1050 union LitChannel { @@ -113,13 +125,6 @@ union LitChannel } }; -struct ColorChannel -{ - u32 ambColor; - u32 matColor; - LitChannel color; - LitChannel alpha; -}; union INVTXSPEC { @@ -159,6 +164,52 @@ union PostMtxInfo u32 hex; }; + + + +struct Light +{ + u32 useless[3]; + u32 color; //rgba + float a0; //attenuation + float a1; + float a2; + float k0; //k stuff + float k1; + float k2; + union + { + struct { + float dpos[3]; + float ddir[3]; // specular lights only + }; + struct { + float sdir[3]; + float shalfangle[3]; // specular lights only + }; + }; +}; + + + +struct ColorChannel +{ + u32 ambColor; + u32 matColor; + LitChannel color; + LitChannel alpha; +}; + +struct Viewport +{ + float wd; + float ht; + float nearZ; + float xOrig; + float yOrig; + float farZ; +}; + struct TexCoordInfo { TexMtxInfo texmtxinfo; @@ -177,25 +228,9 @@ struct XFRegisters float rawProjection[7]; }; -#define XFMEM_SIZE 0x8000 -#define XFMEM_POSMATRICES 0x000 -#define XFMEM_POSMATRICES_END 0x100 -#define XFMEM_NORMALMATRICES 0x400 -#define XFMEM_NORMALMATRICES_END 0x460 -#define XFMEM_POSTMATRICES 0x500 -#define XFMEM_POSTMATRICES_END 0x600 -#define XFMEM_LIGHTS 0x600 -#define XFMEM_LIGHTS_END 0x680 -struct Viewport -{ - float wd; - float ht; - float nearZ; - float xOrig; - float yOrig; - float farZ; -}; + + extern XFRegisters xfregs; extern u32 xfmem[XFMEM_SIZE]; @@ -203,4 +238,4 @@ extern u32 xfmem[XFMEM_SIZE]; void LoadXFReg(u32 transferSize, u32 address, u32 *pData); void LoadIndexedXF(u32 val, int array); -#endif +#endif // _XFMEMORY_H diff --git a/Source/Core/VideoCommon/Src/XFStructs.cpp b/Source/Core/VideoCommon/Src/XFStructs.cpp index b9d8770263..cff9a872a9 100644 --- a/Source/Core/VideoCommon/Src/XFStructs.cpp +++ b/Source/Core/VideoCommon/Src/XFStructs.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -32,161 +32,145 @@ void LoadXFReg(u32 transferSize, u32 baseAddress, u32 *pData) address = baseAddress + i; // Setup a Matrix - if (address < 0x1000) + if (address < XFMEM_ERROR) { VertexManager::Flush(); VertexShaderManager::InvalidateXFRange(address, address + transferSize); //PRIM_LOG("xfmem write: 0x%x-0x%x\n", address, address+transferSize); - u32* p1 = &xfmem[address]; - memcpy_gc(p1, &pData[i], transferSize*4); + memcpy_gc((u32*)&xfmem[address], &pData[i], transferSize*4); i += transferSize; } + else if (address >= XFMEM_SETTEXMTXINFO && address <= XFMEM_SETTEXMTXINFO+7) + { + xfregs.texcoords[address - XFMEM_SETTEXMTXINFO].texmtxinfo.hex = pData[i]; + } + else if (address >= XFMEM_SETPOSMTXINFO && address <= XFMEM_SETPOSMTXINFO+7) + { + xfregs.texcoords[address - XFMEM_SETPOSMTXINFO].postmtxinfo.hex = pData[i]; + } else if (address < 0x2000) { u32 data = pData[i]; switch (address) { - case 0x1000: // error + case XFMEM_ERROR: + case XFMEM_DIAG: + case XFMEM_STATE0: // internal state 0 + case XFMEM_STATE1: // internal state 1 + case XFMEM_CLOCK: + case XFMEM_SETGPMETRIC: break; - case 0x1001: // diagnostics + + case XFMEM_CLIPDISABLE: + //if (data & 1) {} // disable clipping detection + //if (data & 2) {} // disable trivial rejection + //if (data & 4) {} // disable cpoly clipping acceleration break; - case 0x1002: // internal state 0 - break; - case 0x1003: // internal state 1 - break; - case 0x1004: // xf_clock - break; - case 0x1005: // clipdisable - if (data & 1) { // disable clipping detection - } - if (data & 2) { // disable trivial rejection - } - if (data & 4) { // disable cpoly clipping acceleration - } - break; - case 0x1006: //SetGPMetric - break; - case 0x1008: //__GXXfVtxSpecs, wrote 0004 + + case XFMEM_VTXSPECS: //__GXXfVtxSpecs, wrote 0004 xfregs.hostinfo = *(INVTXSPEC*)&data; break; - case 0x1009: //GXSetNumChans (no) - if ((u32)xfregs.nNumChans != (data & 3)) { + + case XFMEM_SETNUMCHAN: + if ((u32)xfregs.nNumChans != (data & 3)) + { VertexManager::Flush(); xfregs.nNumChans = data & 3; } break; - case 0x100a: //GXSetChanAmbientcolor - if (xfregs.colChans[0].ambColor != data) { - VertexManager::Flush(); - xfregs.colChans[0].ambColor = data; - VertexShaderManager::SetMaterialColor(0, data); - } - break; - case 0x100b: //GXSetChanAmbientcolor - if (xfregs.colChans[1].ambColor != data) { - VertexManager::Flush(); - xfregs.colChans[1].ambColor = data; - VertexShaderManager::SetMaterialColor(1, data); - } - break; - case 0x100c: //GXSetChanMatcolor (rgba) - if (xfregs.colChans[0].matColor != data) { - VertexManager::Flush(); - xfregs.colChans[0].matColor = data; - VertexShaderManager::SetMaterialColor(2, data); - } - break; - case 0x100d: //GXSetChanMatcolor (rgba) - if (xfregs.colChans[1].matColor != data) { - VertexManager::Flush(); - xfregs.colChans[1].matColor = data; - VertexShaderManager::SetMaterialColor(3, data); - } - break; - case 0x100e: // color0 - if (xfregs.colChans[0].color.hex != (data & 0x7fff) ) { - VertexManager::Flush(); - xfregs.colChans[0].color.hex = data; - } - break; - case 0x100f: // color1 - if (xfregs.colChans[1].color.hex != (data & 0x7fff) ) { - VertexManager::Flush(); - xfregs.colChans[1].color.hex = data; - } - break; - case 0x1010: // alpha0 - if (xfregs.colChans[0].alpha.hex != (data & 0x7fff) ) { - VertexManager::Flush(); - xfregs.colChans[0].alpha.hex = data; - } - break; - case 0x1011: // alpha1 - if (xfregs.colChans[1].alpha.hex != (data & 0x7fff) ) { - VertexManager::Flush(); - xfregs.colChans[1].alpha.hex = data; - } - break; - case 0x1012: // dual tex transform - if (xfregs.bEnableDualTexTransform != (data & 1)) { + case XFMEM_SETCHAN0_AMBCOLOR: // Channel Ambient Color + case XFMEM_SETCHAN1_AMBCOLOR: + { + u8 chan = address - XFMEM_SETCHAN0_AMBCOLOR; + if (xfregs.colChans[chan].ambColor != data) + { + VertexManager::Flush(); + xfregs.colChans[chan].ambColor = data; + VertexShaderManager::SetMaterialColor(chan, data); + } + break; + } + + case XFMEM_SETCHAN0_MATCOLOR: // Channel Material Color + case XFMEM_SETCHAN1_MATCOLOR: + { + u8 chan = address - XFMEM_SETCHAN0_MATCOLOR; + if (xfregs.colChans[chan].matColor != data) + { + VertexManager::Flush(); + xfregs.colChans[chan].matColor = data; + VertexShaderManager::SetMaterialColor(address - XFMEM_SETCHAN0_AMBCOLOR, data); + } + break; + } + + case XFMEM_SETCHAN0_COLOR: // Channel Color + case XFMEM_SETCHAN1_COLOR: + { + u8 chan = address - XFMEM_SETCHAN0_COLOR; + if (xfregs.colChans[chan].color.hex != (data & 0x7fff)) + { + VertexManager::Flush(); + xfregs.colChans[chan].color.hex = data; + } + break; + } + + case XFMEM_SETCHAN0_ALPHA: // Channel Alpha + case XFMEM_SETCHAN1_ALPHA: + { + u8 chan = address - XFMEM_SETCHAN0_ALPHA; + if (xfregs.colChans[chan].alpha.hex != (data & 0x7fff)) + { + VertexManager::Flush(); + xfregs.colChans[chan].alpha.hex = data; + } + break; + } + + case XFMEM_DUALTEX: + if (xfregs.bEnableDualTexTransform != (data & 1)) + { VertexManager::Flush(); xfregs.bEnableDualTexTransform = data & 1; } break; - case 0x1013: - case 0x1014: - case 0x1015: - case 0x1016: - case 0x1017: - DEBUG_LOG(VIDEO, "xf addr: %x=%x\n", address, data); - break; - case 0x1018: + + case XFMEM_SETMATRIXINDA: //_assert_msg_(GX_XF, 0, "XF matrixindex0"); - VertexShaderManager::SetTexMatrixChangedA(data); //? + VertexShaderManager::SetTexMatrixChangedA(data); // ? break; - case 0x1019: + case XFMEM_SETMATRIXINDB: //_assert_msg_(GX_XF, 0, "XF matrixindex1"); - VertexShaderManager::SetTexMatrixChangedB(data); //? + VertexShaderManager::SetTexMatrixChangedB(data); // ? break; - case 0x101a: + case XFMEM_SETVIEWPORT: VertexManager::Flush(); VertexShaderManager::SetViewport((float*)&pData[i]); PixelShaderManager::SetViewport((float*)&pData[i]); i += 6; break; - case 0x101c: // paper mario writes 16777216.0f, 1677721.75 - break; - case 0x101f: // paper mario writes 16777216.0f, 5033165.0f - break; - - case 0x1020: + case XFMEM_SETPROJECTION: VertexManager::Flush(); VertexShaderManager::SetProjection((float*)&pData[i]); i += 7; - return; + break; - case 0x103f: // GXSetNumTexGens - if ((u32)xfregs.numTexGens != data) { + case XFMEM_SETNUMTEXGENS: // GXSetNumTexGens + if ((u32)xfregs.numTexGens != data) + { VertexManager::Flush(); xfregs.numTexGens = data; } break; - case 0x1040: xfregs.texcoords[0].texmtxinfo.hex = data; break; - case 0x1041: xfregs.texcoords[1].texmtxinfo.hex = data; break; - case 0x1042: xfregs.texcoords[2].texmtxinfo.hex = data; break; - case 0x1043: xfregs.texcoords[3].texmtxinfo.hex = data; break; - case 0x1044: xfregs.texcoords[4].texmtxinfo.hex = data; break; - case 0x1045: xfregs.texcoords[5].texmtxinfo.hex = data; break; - case 0x1046: xfregs.texcoords[6].texmtxinfo.hex = data; break; - case 0x1047: xfregs.texcoords[7].texmtxinfo.hex = data; break; - - case 0x1048: + // Maybe these are for Normals? + case 0x1048: //xfregs.texcoords[0].nrmmtxinfo.hex = data; break; ?? case 0x1049: case 0x104a: case 0x104b: @@ -194,27 +178,25 @@ void LoadXFReg(u32 transferSize, u32 baseAddress, u32 *pData) case 0x104d: case 0x104e: case 0x104f: - DEBUG_LOG(VIDEO, "xf addr: %x=%x\n", address, data); - break; - case 0x1050: xfregs.texcoords[0].postmtxinfo.hex = data; break; - case 0x1051: xfregs.texcoords[1].postmtxinfo.hex = data; break; - case 0x1052: xfregs.texcoords[2].postmtxinfo.hex = data; break; - case 0x1053: xfregs.texcoords[3].postmtxinfo.hex = data; break; - case 0x1054: xfregs.texcoords[4].postmtxinfo.hex = data; break; - case 0x1055: xfregs.texcoords[5].postmtxinfo.hex = data; break; - case 0x1056: xfregs.texcoords[6].postmtxinfo.hex = data; break; - case 0x1057: xfregs.texcoords[7].postmtxinfo.hex = data; break; + DEBUG_LOG(VIDEO, "Possible Normal Mtx XF reg?: %x=%x\n", address, data); + break; + // -------------- + // Unknown Regs + // -------------- + case 0x1013: + case 0x1014: + case 0x1015: + case 0x1016: + case 0x1017: + + case 0x101c: // paper mario writes 16777216.0f, 1677721.75 + case 0x101f: // paper mario writes 16777216.0f, 5033165.0f default: - DEBUG_LOG(VIDEO, "xf addr: %x=%x\n", address, data); + WARN_LOG(VIDEO, "Unknown XF Reg: %x=%x\n", address, data); break; } } - else if (address >= 0x4000) - { - // MessageBox(NULL, "1", "1", MB_OK); - //4010 __GXSetGenMode - } } } @@ -222,7 +204,7 @@ void LoadXFReg(u32 transferSize, u32 baseAddress, u32 *pData) void LoadIndexedXF(u32 val, int array) { int index = val >> 16; - int address = val & 0xFFF; //check mask + int address = val & 0xFFF; // check mask int size = ((val >> 12) & 0xF) + 1; //load stuff from array to address in xf mem @@ -231,5 +213,5 @@ void LoadIndexedXF(u32 val, int array) //PRIM_LOG("xfmem iwrite: 0x%x-0x%x\n", address, address+size); for (int i = 0; i < size; i++) - xfmem[address + i] = Memory_Read_U32(arraybases[array] + arraystrides[array]*index + i*4); + xfmem[address + i] = Memory_Read_U32(arraybases[array] + arraystrides[array] * index + i * 4); } diff --git a/Source/Core/VideoCommon/Src/XFStructs.h b/Source/Core/VideoCommon/Src/XFStructs.h index 005c20c1d5..b9f4dbf7df 100644 --- a/Source/Core/VideoCommon/Src/XFStructs.h +++ b/Source/Core/VideoCommon/Src/XFStructs.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -15,4 +15,9 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ +#ifndef _XFSTRUCTS_H +#define _XFSTRUCTS_H + #include "XFMemory.h" + +#endif // _XFSTRUCTS_H diff --git a/Source/Core/VideoCommon/VideoCommon.vcproj b/Source/Core/VideoCommon/VideoCommon.vcproj index eaa810a193..5c32f00e69 100644 --- a/Source/Core/VideoCommon/VideoCommon.vcproj +++ b/Source/Core/VideoCommon/VideoCommon.vcproj @@ -406,7 +406,7 @@ + + @@ -436,6 +440,14 @@ RelativePath=".\Src\BPMemory.h" > + + + + @@ -462,7 +474,7 @@ + + + + @@ -516,6 +536,14 @@ RelativePath=".\Src\LookUpTables.h" > + + + + @@ -566,8 +594,12 @@ + + @@ -608,39 +640,43 @@ RelativePath=".\Src\VertexLoader_TextCoord.h" > + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -649,42 +685,10 @@ RelativePath=".\Src\NativeVertexFormat.h" > - - - - - - - - - - - - - - - - diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda_Voice.cpp b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda_Voice.cpp index 5d13588c52..75bdb2a14c 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda_Voice.cpp +++ b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_Zelda_Voice.cpp @@ -143,7 +143,7 @@ clear_buffer: } // SetupAccelerator const s16 *read_ptr = (s16*)GetARAMPointer(PB.CurAddr); - if (PB.RemLength < rem_samples) + if (PB.RemLength < (u32)rem_samples) { // finish-up loop for (u32 i = 0; i < PB.RemLength; i++) @@ -202,7 +202,7 @@ clear_buffer: // SetupAccelerator const s8 *read_ptr = (s8*)GetARAMPointer(PB.CurAddr); - if (PB.RemLength < rem_samples) + if (PB.RemLength < (u32)rem_samples) { // finish-up loop for (u32 i = 0; i < PB.RemLength; i++) @@ -365,7 +365,7 @@ void CUCode_Zelda::RenderVoice_Raw(ZeldaVoicePB &PB, s16 *_Buffer, int _Size) // The PB.StopOnSilence check is a hack, we should check the buffers and enter this // only when the buffer is completely 0 (i.e. when the music has finished fading out) - if (PB.StopOnSilence || PB.RemLength < _RealSize) + if (PB.StopOnSilence || PB.RemLength < (u32)_RealSize) { WARN_LOG(DSPHLE, "Raw: END"); // Let's ignore this entire case since it doesn't seem to happen @@ -517,8 +517,8 @@ void CUCode_Zelda::RenderAddVoice(ZeldaVoicePB &PB, s32* _LeftBuffer, s32* _Righ switch (PB.Format) { // Synthesized sounds + case 0x0003: WARN_LOG(DSPHLE, "PB Format 0x03 used!"); case 0x0000: // Example: Magic meter filling up in ZWW - case 0x0003: RenderSynth_RectWave(PB, m_VoiceBuffer, _Size); break; @@ -533,7 +533,7 @@ void CUCode_Zelda::RenderAddVoice(ZeldaVoicePB &PB, s32* _LeftBuffer, s32* _Righ break; // These are more "synth" formats - square wave, saw wave etc. - case 0x0002: + case 0x0002: WARN_LOG(DSPHLE, "PB Format 0x02 used!"); case 0x0004: // Example: Big Pikmin onion mothership landing/building a bridge in Pikmin case 0x0007: // Example: "success" SFX in Pikmin 1, Pikmin 2 in a cave, not sure what sound it is. case 0x000b: // Example: SFX in area selection menu in Pikmin diff --git a/Source/Plugins/Plugin_VideoDX9/Src/BPFunctions.cpp b/Source/Plugins/Plugin_VideoDX9/Src/BPFunctions.cpp index 5a321f43d1..7bc104dc8a 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/BPFunctions.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/BPFunctions.cpp @@ -100,7 +100,7 @@ void FlushPipeline() VertexManager::Flush(); } -void SetGenerationMode(const Bypass &bp) +void SetGenerationMode(const BPCmd &bp) { // dev->SetRenderState(D3DRS_CULLMODE, d3dCullModes[bpmem.genMode.cullmode]); Renderer::SetRenderState(D3DRS_CULLMODE, d3dCullModes[bpmem.genMode.cullmode]); @@ -123,17 +123,17 @@ void SetGenerationMode(const Bypass &bp) } } -void SetScissor(const Bypass &bp) +void SetScissor(const BPCmd &bp) { Renderer::SetScissorRect(); } -void SetLineWidth(const Bypass &bp) +void SetLineWidth(const BPCmd &bp) { // We can't change line width in D3D unless we use ID3DXLine float psize = float(bpmem.lineptwidth.pointsize) * 6.0f; Renderer::SetRenderState(D3DRS_POINTSIZE, *((DWORD*)&psize)); } -void SetDepthMode(const Bypass &bp) +void SetDepthMode(const BPCmd &bp) { if (bpmem.zmode.testenable) { @@ -159,7 +159,7 @@ void SetDepthMode(const Bypass &bp) // Renderer::SetRenderMode(Renderer::RM_Normal); } -void SetBlendMode(const Bypass &bp) +void SetBlendMode(const BPCmd &bp) { if (bp.changes & 1) Renderer::SetRenderState(D3DRS_ALPHABLENDENABLE, bpmem.blendmode.blendenable); @@ -196,15 +196,15 @@ void SetBlendMode(const Bypass &bp) Renderer::SetRenderState(D3DRS_BLENDOP, bpmem.blendmode.subtract ? D3DBLENDOP_SUBTRACT : D3DBLENDOP_ADD); } } -void SetDitherMode(const Bypass &bp) +void SetDitherMode(const BPCmd &bp) { Renderer::SetRenderState(D3DRS_DITHERENABLE,bpmem.blendmode.dither); } -void SetLogicOpMode(const Bypass &bp) +void SetLogicOpMode(const BPCmd &bp) { // Logic op blending. D3D can't do this but can fake some modes. } -void SetColorMask(const Bypass &bp) +void SetColorMask(const BPCmd &bp) { DWORD write = 0; if (bpmem.blendmode.alphaupdate) @@ -215,7 +215,7 @@ void SetColorMask(const Bypass &bp) Renderer::SetRenderState(D3DRS_COLORWRITEENABLE, write); } -void CopyEFB(const Bypass &bp, const EFBRectangle &rc, const u32 &address, const bool &fromZBuffer, const bool &isIntensityFmt, const u32 ©fmt, const bool &scaleByHalf) +void CopyEFB(const BPCmd &bp, const EFBRectangle &rc, const u32 &address, const bool &fromZBuffer, const bool &isIntensityFmt, const u32 ©fmt, const bool &scaleByHalf) { // TODO: Scale EFBRectangle correctly @@ -223,13 +223,13 @@ void CopyEFB(const Bypass &bp, const EFBRectangle &rc, const u32 &address, const TextureCache::CopyEFBToRenderTarget(bpmem.copyTexDest<<5, &rec); } -void RenderToXFB(const Bypass &bp, const EFBRectangle &rc, const float &yScale, const float &xfbLines, u32 xfbAddr, const u32 &dstWidth, const u32 &dstHeight) +void RenderToXFB(const BPCmd &bp, const EFBRectangle &rc, const float &yScale, const float &xfbLines, u32 xfbAddr, const u32 &dstWidth, const u32 &dstHeight) { Renderer::SwapBuffers(); PRIM_LOG("Renderer::SwapBuffers()"); g_VideoInitialize.pCopiedToXFB(); } -void ClearScreen(const Bypass &bp, const EFBRectangle &rc) +void ClearScreen(const BPCmd &bp, const EFBRectangle &rc) { // TODO: Scale EFBRectangle correctly @@ -263,7 +263,7 @@ void ClearScreen(const Bypass &bp, const EFBRectangle &rc) D3D::dev->Clear(0, NULL, clearflags, col, clearZ, 0); } -void RestoreRenderState(const Bypass &bp) +void RestoreRenderState(const BPCmd &bp) { //Renderer::SetRenderMode(Renderer::RM_Normal); } @@ -287,7 +287,7 @@ u8 *GetPointer(const u32 &address) { return g_VideoInitialize.pGetMemoryPointer(address); } -void SetSamplerState(const Bypass &bp) +void SetSamplerState(const BPCmd &bp) { FourTexUnits &tex = bpmem.tex[(bp.address & 0xE0) == 0xA0]; int stage = (bp.address & 3);//(addr>>4)&2; @@ -326,7 +326,7 @@ void SetSamplerState(const Bypass &bp) //sprintf(temp,"lod %f",tm0.lod_bias/4.0f); //g_VideoInitialize.pLog(temp); } -void SetInterlacingMode(const Bypass &bp) +void SetInterlacingMode(const BPCmd &bp) { // TODO } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/BPFunctions.cpp b/Source/Plugins/Plugin_VideoOGL/Src/BPFunctions.cpp index b1454b354e..fbb599b0ae 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/BPFunctions.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/BPFunctions.cpp @@ -47,7 +47,7 @@ void FlushPipeline() { VertexManager::Flush(); } -void SetGenerationMode(const Bypass &bp) +void SetGenerationMode(const BPCmd &bp) { // none, ccw, cw, ccw if (bpmem.genMode.cullmode > 0) @@ -60,13 +60,13 @@ void SetGenerationMode(const Bypass &bp) } -void SetScissor(const Bypass &bp) +void SetScissor(const BPCmd &bp) { if (!Renderer::SetScissorRect()) if (bp.address == BPMEM_SCISSORBR) ERROR_LOG(VIDEO, "bad scissor!"); } -void SetLineWidth(const Bypass &bp) +void SetLineWidth(const BPCmd &bp) { float fratio = xfregs.rawViewport[0] != 0 ? ((float)Renderer::GetTargetWidth() / EFB_WIDTH) : 1.0f; if (bpmem.lineptwidth.linesize > 0) @@ -74,7 +74,7 @@ void SetLineWidth(const Bypass &bp) if (bpmem.lineptwidth.pointsize > 0) glPointSize((float)bpmem.lineptwidth.pointsize * fratio / 6.0f); } -void SetDepthMode(const Bypass &bp) +void SetDepthMode(const BPCmd &bp) { if (bpmem.zmode.testenable) { @@ -89,18 +89,18 @@ void SetDepthMode(const Bypass &bp) glDepthMask(GL_FALSE); } } -void SetBlendMode(const Bypass &bp) +void SetBlendMode(const BPCmd &bp) { Renderer::SetBlendMode(false); } -void SetDitherMode(const Bypass &bp) +void SetDitherMode(const BPCmd &bp) { if (bpmem.blendmode.dither) glEnable(GL_DITHER); else glDisable(GL_DITHER); } -void SetLogicOpMode(const Bypass &bp) +void SetLogicOpMode(const BPCmd &bp) { if (bpmem.blendmode.logicopenable) { @@ -111,12 +111,12 @@ void SetLogicOpMode(const Bypass &bp) glDisable(GL_COLOR_LOGIC_OP); } -void SetColorMask(const Bypass &bp) +void SetColorMask(const BPCmd &bp) { Renderer::SetColorMask(); } -void CopyEFB(const Bypass &bp, const EFBRectangle &rc, const u32 &address, const bool &fromZBuffer, const bool &isIntensityFmt, const u32 ©fmt, const bool &scaleByHalf) +void CopyEFB(const BPCmd &bp, const EFBRectangle &rc, const u32 &address, const bool &fromZBuffer, const bool &isIntensityFmt, const u32 ©fmt, const bool &scaleByHalf) { // bpmem.zcontrol.pixel_format to PIXELFMT_Z24 is when the game wants to copy from ZBuffer (Zbuffer uses 24-bit Format) if (!g_Config.bEFBCopyDisable) @@ -126,12 +126,12 @@ void CopyEFB(const Bypass &bp, const EFBRectangle &rc, const u32 &address, const TextureMngr::CopyRenderTargetToTexture(address, fromZBuffer, isIntensityFmt, copyfmt, scaleByHalf, rc); } -void RenderToXFB(const Bypass &bp, const EFBRectangle &rc, const float &yScale, const float &xfbLines, u32 xfbAddr, const u32 &dstWidth, const u32 &dstHeight) +void RenderToXFB(const BPCmd &bp, const EFBRectangle &rc, const float &yScale, const float &xfbLines, u32 xfbAddr, const u32 &dstWidth, const u32 &dstHeight) { Renderer::RenderToXFB(xfbAddr, dstWidth, dstHeight, rc); } -void ClearScreen(const Bypass &bp, const EFBRectangle &rc) +void ClearScreen(const BPCmd &bp, const EFBRectangle &rc) { bool colorEnable = bpmem.blendmode.colorupdate; bool alphaEnable = (bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24 && bpmem.blendmode.alphaupdate); @@ -146,7 +146,7 @@ void ClearScreen(const Bypass &bp, const EFBRectangle &rc) } } -void RestoreRenderState(const Bypass &bp) +void RestoreRenderState(const BPCmd &bp) { Renderer::RestoreGLState(); } @@ -170,11 +170,11 @@ u8 *GetPointer(const u32 &address) { return g_VideoInitialize.pGetMemoryPointer(address); } -void SetSamplerState(const Bypass &bp) +void SetSamplerState(const BPCmd &bp) { // TODO } -void SetInterlacingMode(const Bypass &bp) +void SetInterlacingMode(const BPCmd &bp) { // TODO } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp index b098461ce2..0055ac0f17 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Config.cpp @@ -54,7 +54,6 @@ void Config::Load() iniFile.Get("Settings", "SafeTextureCache", &bSafeTextureCache, false); // Settings iniFile.Get("Settings", "ShowFPS", &bShowFPS, false); // Settings iniFile.Get("Settings", "OverlayStats", &bOverlayStats, false); - iniFile.Get("Settings", "OverlayBlendStats", &bOverlayBlendStats, false); iniFile.Get("Settings", "OverlayProjStats", &bOverlayProjStats, false); iniFile.Get("Settings", "ShowEFBCopyRegions", &bShowEFBCopyRegions, false); iniFile.Get("Settings", "DLOptimize", &iCompileDLsLevel, 0); @@ -148,7 +147,6 @@ void Config::Save() iniFile.Set("Settings", "SafeTextureCache", bSafeTextureCache); iniFile.Set("Settings", "ShowFPS", bShowFPS); iniFile.Set("Settings", "OverlayStats", bOverlayStats); - iniFile.Set("Settings", "OverlayBlendStats", bOverlayBlendStats); iniFile.Set("Settings", "OverlayProjStats", bOverlayProjStats); iniFile.Set("Settings", "DLOptimize", iCompileDLsLevel); iniFile.Set("Settings", "Show", iCompileDLsLevel); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Config.h b/Source/Plugins/Plugin_VideoOGL/Src/Config.h index 4692cf0928..f071dac01a 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Config.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/Config.h @@ -73,7 +73,6 @@ struct Config // Information bool bShowFPS; bool bOverlayStats; - bool bOverlayBlendStats; bool bOverlayProjStats; bool bTexFmtOverlayEnable; bool bTexFmtOverlayCenter; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp index b8acf8aff2..4ef011d544 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.cpp @@ -56,7 +56,6 @@ BEGIN_EVENT_TABLE(GFXConfigDialogOGL,wxDialog) EVT_CHECKBOX(ID_WIREFRAME, GFXConfigDialogOGL::AdvancedSettingsChanged) EVT_CHECKBOX(ID_SHOWFPS, GFXConfigDialogOGL::AdvancedSettingsChanged) EVT_CHECKBOX(ID_STATISTICS, GFXConfigDialogOGL::AdvancedSettingsChanged) - EVT_CHECKBOX(ID_BLENDSTATS, GFXConfigDialogOGL::AdvancedSettingsChanged) EVT_CHECKBOX(ID_PROJSTATS, GFXConfigDialogOGL::AdvancedSettingsChanged) EVT_CHECKBOX(ID_SHOWEFBCOPYREGIONS, GFXConfigDialogOGL::AdvancedSettingsChanged) EVT_CHECKBOX(ID_SHADERERRORS, GFXConfigDialogOGL::AdvancedSettingsChanged) @@ -100,9 +99,7 @@ GFXConfigDialogOGL::~GFXConfigDialogOGL() } void GFXConfigDialogOGL::OnClose(wxCloseEvent& event) { - g_Config.Save(); - - INFO_LOG(CONSOLE, "OnClose"); + //INFO_LOG(CONSOLE, "OnClose"); // notice that we don't run wxEntryCleanup(); here so the dll will still be loaded /* JP: Yes, it seems like Close() does not do that. It only runs EndModal() or something @@ -113,18 +110,20 @@ void GFXConfigDialogOGL::OnClose(wxCloseEvent& event) //EndModal(0); // Allow wxWidgets to close and unload the window - event.Skip(); + //event.Skip(); + CloseWindow(); } void GFXConfigDialogOGL::CloseClick(wxCommandEvent& WXUNUSED (event)) { - INFO_LOG(CONSOLE, "CloseClick"); + //INFO_LOG(CONSOLE, "CloseClick"); // If we run wxEntryCleanup() the class will be entirely deleted, and the destructor will be run //g_Config.Save(); //wxEntryCleanup(); - Close(); + //Close(); + CloseWindow(); } /////////////////////////////// @@ -354,8 +353,6 @@ void GFXConfigDialogOGL::CreateGUIControls() m_ShowFPS->SetValue(g_Config.bShowFPS); m_Statistics = new wxCheckBox(m_PageAdvanced, ID_STATISTICS, wxT("Overlay some statistics"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_Statistics->SetValue(g_Config.bOverlayStats); - m_BlendStats = new wxCheckBox(m_PageAdvanced, ID_BLENDSTATS, wxT("Overlay Blend Stats"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); - m_BlendStats->SetValue(g_Config.bOverlayBlendStats); m_ProjStats = new wxCheckBox(m_PageAdvanced, ID_PROJSTATS, wxT("Overlay Projection Stats"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_ProjStats->SetValue(g_Config.bOverlayProjStats); m_ShowEFBCopyRegions = new wxCheckBox(m_PageAdvanced, ID_SHOWEFBCOPYREGIONS, wxT("Show EFB Copy Regions"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); @@ -463,11 +460,10 @@ void GFXConfigDialogOGL::CreateGUIControls() sInfo->Add(m_ShowFPS, wxGBPosition(0, 0), wxGBSpan(1, 2), wxALL, 5); sInfo->Add(m_ShaderErrors, wxGBPosition(1, 0), wxGBSpan(1, 2), wxALL, 5); sInfo->Add(m_Statistics, wxGBPosition(2, 0), wxGBSpan(1, 2), wxALL, 5); - sInfo->Add(m_BlendStats, wxGBPosition(3, 0), wxGBSpan(1, 2), wxALL, 5); - sInfo->Add(m_ProjStats, wxGBPosition(4, 0), wxGBSpan(1, 2), wxALL, 5); - sInfo->Add(m_ShowEFBCopyRegions, wxGBPosition(5, 0), wxGBSpan(1, 2), wxALL, 5); - sInfo->Add(m_TexFmtOverlay, wxGBPosition(6, 0), wxGBSpan(1, 1), wxALL, 5); - sInfo->Add(m_TexFmtCenter, wxGBPosition(6, 1), wxGBSpan(1, 1), wxALL, 5); + sInfo->Add(m_ProjStats, wxGBPosition(3, 0), wxGBSpan(1, 2), wxALL, 5); + sInfo->Add(m_ShowEFBCopyRegions, wxGBPosition(4, 0), wxGBSpan(1, 2), wxALL, 5); + sInfo->Add(m_TexFmtOverlay, wxGBPosition(5, 0), wxGBSpan(1, 1), wxALL, 5); + sInfo->Add(m_TexFmtCenter, wxGBPosition(5, 1), wxGBSpan(1, 1), wxALL, 5); sbInfo->Add(sInfo); wxBoxSizer *sRenderBoxRow1 = new wxBoxSizer(wxHORIZONTAL); @@ -711,9 +707,6 @@ void GFXConfigDialogOGL::AdvancedSettingsChanged(wxCommandEvent& event) TextureMngr::ClearRenderTargets(); g_Config.bCopyEFBToRAM = false; break; - case ID_BLENDSTATS: - g_Config.bOverlayBlendStats = m_BlendStats->IsChecked(); - break; case ID_PROJSTATS: g_Config.bOverlayProjStats = m_ProjStats->IsChecked(); break; @@ -725,6 +718,13 @@ void GFXConfigDialogOGL::AdvancedSettingsChanged(wxCommandEvent& event) UpdateGUI(); } +void GFXConfigDialogOGL::CloseWindow() +{ + // Save the config to INI + g_Config.Save(); + + EndModal(1); +} void GFXConfigDialogOGL::UpdateGUI() { diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h index f5abf1b238..0ebd45243a 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/GUI/ConfigDlg.h @@ -113,7 +113,6 @@ class GFXConfigDialogOGL : public wxDialog wxCheckBox *m_ShowFPS; wxCheckBox *m_ShaderErrors; wxCheckBox *m_Statistics; - wxCheckBox *m_BlendStats; wxCheckBox *m_ProjStats; wxCheckBox *m_ShowEFBCopyRegions; wxCheckBox *m_TexFmtOverlay; @@ -171,7 +170,6 @@ class GFXConfigDialogOGL : public wxDialog ID_SHOWFPS, ID_SHADERERRORS, ID_STATISTICS, - ID_BLENDSTATS, ID_PROJSTATS, ID_SHOWEFBCOPYREGIONS, ID_TEXFMTOVERLAY, @@ -213,7 +211,8 @@ class GFXConfigDialogOGL : public wxDialog void ReloadShaderClick(wxCommandEvent& event); void EditShaderClick(wxCommandEvent& event); void GeneralSettingsChanged(wxCommandEvent& event); - void AdvancedSettingsChanged(wxCommandEvent& event); + void AdvancedSettingsChanged(wxCommandEvent& event); + void CloseWindow(); }; #endif // _OGL_CONFIGDIALOG_H_ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index 125168e059..732fc75fe3 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -67,7 +67,7 @@ Make AA apply instantly during gameplay if possible GFXConfigDialogOGL *m_ConfigFrame = NULL; #include "Debugger/Debugger.h" GFXDebuggerOGL *m_DebuggerFrame = NULL; -#endif +#endif // HAVE_WX #include "Config.h" #include "LookUpTables.h" @@ -97,6 +97,8 @@ GFXDebuggerOGL *m_DebuggerFrame = NULL; SVideoInitialize g_VideoInitialize; PLUGIN_GLOBALS* globals = NULL; +bool allowConfigShow = true; + // Logging int GLScissorX, GLScissorY, GLScissorW, GLScissorH; @@ -108,6 +110,10 @@ static Common::Event s_swapResponseEvent; static volatile u32 s_efbAccessRequested = false; static Common::Event s_efbResponseEvent; +#if defined(HAVE_WX) && HAVE_WX + +#endif // HAVE_WX + void GetDllInfo (PLUGIN_INFO* _PluginInfo) { @@ -169,13 +175,17 @@ void DllDebugger(HWND _hParent, bool Show) { } void DllConfig(HWND _hParent) { #if defined(HAVE_WX) && HAVE_WX - if (!m_ConfigFrame) - m_ConfigFrame = new GFXConfigDialogOGL(GetParentedWxWindow(_hParent)); - else if (!m_ConfigFrame->GetParent()->IsShown()) - m_ConfigFrame->Close(true); + //if (!m_ConfigFrame) +if (allowConfigShow) // Prevent user to show more than 1 config window at same time +{ + m_ConfigFrame = new GFXConfigDialogOGL(GetParentedWxWindow(_hParent)); + + //else if (!m_ConfigFrame->GetParent()->IsShown()) + // m_ConfigFrame->Close(true); #if defined(_WIN32) + // Search for avaliable resolutions DWORD iModeNum = 0; @@ -294,13 +304,16 @@ void DllConfig(HWND _hParent) } // Only allow one open at a time - if (!m_ConfigFrame->IsShown()) - { + //if (!m_ConfigFrame->IsShown()) + //{ + + allowConfigShow = false; m_ConfigFrame->CreateGUIControls(); - m_ConfigFrame->ShowModal(); - } - else - m_ConfigFrame->Hide(); + allowConfigShow = m_ConfigFrame->ShowModal() == 1 ? true : false; +} + //} + //else + // m_ConfigFrame->Hide(); #endif }