summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorsl1nk3.s <sl1nk3.s@gmail.com>2011-03-04 23:14:21 +0000
committersl1nk3.s <sl1nk3.s@gmail.com>2011-03-04 23:14:21 +0000
commite8a1c04abf58fcc0fa28cb584f806d28f1607fd9 (patch)
tree7626728e51376de5cd5cff27a89d71bfcded6693 /Source/Core
parentc569b33829e77ab9a568198152e5eabe32fdcb8d (diff)
Fix a typo in BPFunctions causing a PanicAlert in SW:RS2.
Really minor bugfix in DX9. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7285 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/VideoCommon/Src/BPFunctions.cpp28
-rw-r--r--Source/Core/VideoCommon/Src/BPMemory.h16
2 files changed, 33 insertions, 11 deletions
diff --git a/Source/Core/VideoCommon/Src/BPFunctions.cpp b/Source/Core/VideoCommon/Src/BPFunctions.cpp
index 7e804e1b57..70fad31a08 100644
--- a/Source/Core/VideoCommon/Src/BPFunctions.cpp
+++ b/Source/Core/VideoCommon/Src/BPFunctions.cpp
@@ -140,6 +140,15 @@ void ClearScreen(const BPCmd &bp, const EFBRectangle &rc)
void OnPixelFormatChange(const BPCmd &bp)
{
int convtype = -1;
+ u32 current_format = Renderer::GetPrevPixelFormat();
+ u32 new_format = bpmem.zcontrol.pixel_format;
+ u32 old_format = current_format & 0x3;
+
+ // Check for Z compression format change
+ // When using 16bit Z, the game may enable a special compression format which we need to handle
+ // If we don't, Z values will be completely screwed up, currently only Star Wars:RS2 uses that.
+ //if (new_format == PIXELFMT_RGB565_Z16 && bpmem.zcontrol.zformat != (current_format >> 2))
+ // VertexShaderManager::SetZformatChanged();
/*
* When changing the EFB format, the pixel data won't get converted to the new format but stays the same.
@@ -150,14 +159,12 @@ void OnPixelFormatChange(const BPCmd &bp)
!g_ActiveConfig.backend_info.bSupportsFormatReinterpretation)
return;
- unsigned int new_format = bpmem.zcontrol.pixel_format;
- unsigned int old_format = Renderer::GetPrevPixelFormat();
-
- // no need to reinterpret pixel data in these cases
+ // no need to reinterpret pixel data in that cases
if (new_format == old_format || old_format == (unsigned int)-1)
goto skip;
- switch (old_format)
+ // Check for pixel format changes
+ switch (old_format & 0x3)
{
case PIXELFMT_RGB8_Z24:
case PIXELFMT_Z24:
@@ -183,21 +190,26 @@ void OnPixelFormatChange(const BPCmd &bp)
if (new_format == PIXELFMT_RGB8_Z24 ||
new_format == PIXELFMT_Z24)
convtype = 4;
- else if (new_format == PIXELFMT_RGB565_Z16)
+ else if (new_format == PIXELFMT_RGBA6_Z24)
convtype = 5;
break;
default:
break;
}
+
if (convtype == -1)
{
- PanicAlert("Unhandled EFB format change: %d to %d\n", old_format, new_format);
+ ERROR_LOG(VIDEO, "Unhandled EFB format change: %d to %d\n", old_format & 0x3, new_format);
goto skip;
}
+
g_renderer->ReinterpretPixelData(convtype);
+
skip:
- Renderer::StorePixelFormat(new_format);
+ DEBUG_LOG(VIDEO, "pixelfmt: pixel=%d, zc=%d", new_format, bpmem.zcontrol.zformat);
+
+ Renderer::StorePixelFormat(new_format | (bpmem.zcontrol.zformat << 2));
}
bool GetConfig(const int &type)
diff --git a/Source/Core/VideoCommon/Src/BPMemory.h b/Source/Core/VideoCommon/Src/BPMemory.h
index 422b515dcc..bcee41461f 100644
--- a/Source/Core/VideoCommon/Src/BPMemory.h
+++ b/Source/Core/VideoCommon/Src/BPMemory.h
@@ -757,13 +757,23 @@ union ConstantAlpha
#define PIXELFMT_V8 6
#define PIXELFMT_YUV420 7
+#define ZC_LINEAR 0
+#define ZC_NEAR 1
+#define ZC_MID 2
+#define ZC_FAR 3
+// It seems these Z formats aren't supported/were removed ?
+#define ZC_INV_LINEAR 4
+#define ZC_INV_NEAR 5
+#define ZC_INV_MID 6
+#define ZC_INV_FAR 7
+
union PE_CONTROL
{
struct
{
- u32 pixel_format : 3; // PIXELFMT_X
- u32 zformat : 3; // 0 - linear, 1 - near, 2 - mid, 3 - far
- u32 zcomploc : 1; // 1: before tex stage
+ u32 pixel_format : 3; // PIXELFMT_X
+ u32 zformat : 3; // Z Compression for 16bit Z format
+ u32 zcomploc : 1; // 1: before tex stage
u32 unused : 17;
u32 rid : 8;
};