summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon
diff options
context:
space:
mode:
authormagumagu <magumagu9@gmail.com>2014-05-08 16:53:18 -0700
committermagumagu <magumagu9@gmail.com>2014-05-10 20:33:28 -0700
commit39d439fc48ef44d0a28113a10cb796cd8989f944 (patch)
tree25a1cccde305a45ee57ae09b7432f3b40ceb1f2e /Source/Core/VideoCommon
parent2983ae2823cb8ff022d896c98df581064a6bb763 (diff)
Opcode decoding: handle missing opcodes 0x88 etc.
Hardware testing shows that they do the same thing as the 0x80 family of opcodes: they draw quads.
Diffstat (limited to 'Source/Core/VideoCommon')
-rw-r--r--Source/Core/VideoCommon/IndexGenerator.cpp26
-rw-r--r--Source/Core/VideoCommon/OpcodeDecoding.h6
-rw-r--r--Source/Core/VideoCommon/VertexManagerBase.cpp4
3 files changed, 21 insertions, 15 deletions
diff --git a/Source/Core/VideoCommon/IndexGenerator.cpp b/Source/Core/VideoCommon/IndexGenerator.cpp
index 949ee342b1..f9838a1daa 100644
--- a/Source/Core/VideoCommon/IndexGenerator.cpp
+++ b/Source/Core/VideoCommon/IndexGenerator.cpp
@@ -6,6 +6,7 @@
#include "Common/Common.h"
#include "VideoCommon/IndexGenerator.h"
+#include "VideoCommon/OpcodeDecoding.h"
#include "VideoCommon/VideoConfig.h"
//Init
@@ -21,22 +22,23 @@ void IndexGenerator::Init()
{
if (g_Config.backend_info.bSupportsPrimitiveRestart)
{
- primitive_table[0] = IndexGenerator::AddQuads<true>;
- primitive_table[2] = IndexGenerator::AddList<true>;
- primitive_table[3] = IndexGenerator::AddStrip<true>;
- primitive_table[4] = IndexGenerator::AddFan<true>;
+ primitive_table[GX_DRAW_QUADS] = IndexGenerator::AddQuads<true>;
+ primitive_table[GX_DRAW_QUADS_2] = IndexGenerator::AddQuads<true>;
+ primitive_table[GX_DRAW_TRIANGLES] = IndexGenerator::AddList<true>;
+ primitive_table[GX_DRAW_TRIANGLE_STRIP] = IndexGenerator::AddStrip<true>;
+ primitive_table[GX_DRAW_TRIANGLE_FAN] = IndexGenerator::AddFan<true>;
}
else
{
- primitive_table[0] = IndexGenerator::AddQuads<false>;
- primitive_table[2] = IndexGenerator::AddList<false>;
- primitive_table[3] = IndexGenerator::AddStrip<false>;
- primitive_table[4] = IndexGenerator::AddFan<false>;
+ primitive_table[GX_DRAW_QUADS] = IndexGenerator::AddQuads<false>;
+ primitive_table[GX_DRAW_QUADS_2] = IndexGenerator::AddQuads<false>;
+ primitive_table[GX_DRAW_TRIANGLES] = IndexGenerator::AddList<false>;
+ primitive_table[GX_DRAW_TRIANGLE_STRIP] = IndexGenerator::AddStrip<false>;
+ primitive_table[GX_DRAW_TRIANGLE_FAN] = IndexGenerator::AddFan<false>;
}
- primitive_table[1] = nullptr;
- primitive_table[5] = &IndexGenerator::AddLineList;
- primitive_table[6] = &IndexGenerator::AddLineStrip;
- primitive_table[7] = &IndexGenerator::AddPoints;
+ primitive_table[GX_DRAW_LINES] = &IndexGenerator::AddLineList;
+ primitive_table[GX_DRAW_LINE_STRIP] = &IndexGenerator::AddLineStrip;
+ primitive_table[GX_DRAW_POINTS] = &IndexGenerator::AddPoints;
}
void IndexGenerator::Start(u16* Indexptr)
diff --git a/Source/Core/VideoCommon/OpcodeDecoding.h b/Source/Core/VideoCommon/OpcodeDecoding.h
index bdc4976825..baf44bd40f 100644
--- a/Source/Core/VideoCommon/OpcodeDecoding.h
+++ b/Source/Core/VideoCommon/OpcodeDecoding.h
@@ -22,15 +22,17 @@
#define GX_PRIMITIVE_SHIFT 3
#define GX_VAT_MASK 0x07
-//these are defined 1/8th of their real values and without their top bit
+// These values are the values extracted using GX_PRIMITIVE_MASK
+// and GX_PRIMITIVE_SHIFT.
+// GX_DRAW_QUADS_2 behaves the same way as GX_DRAW_QUADS.
#define GX_DRAW_QUADS 0x0 // 0x80
+#define GX_DRAW_QUADS_2 0x1 // 0x88
#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_NONE 0x1; // This is a fake value to used in the backends
extern bool g_bRecordFifoData;
diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp
index 624631b805..29feabef4b 100644
--- a/Source/Core/VideoCommon/VertexManagerBase.cpp
+++ b/Source/Core/VideoCommon/VertexManagerBase.cpp
@@ -28,7 +28,7 @@ bool VertexManager::IsFlushed;
static const PrimitiveType primitive_from_gx[8] = {
PRIMITIVE_TRIANGLES, // GX_DRAW_QUADS
- PRIMITIVE_TRIANGLES, // GX_DRAW_NONE
+ PRIMITIVE_TRIANGLES, // GX_DRAW_QUADS_2
PRIMITIVE_TRIANGLES, // GX_DRAW_TRIANGLES
PRIMITIVE_TRIANGLES, // GX_DRAW_TRIANGLE_STRIP
PRIMITIVE_TRIANGLES, // GX_DRAW_TRIANGLE_FAN
@@ -93,6 +93,7 @@ u32 VertexManager::GetRemainingIndices(int primitive)
switch (primitive)
{
case GX_DRAW_QUADS:
+ case GX_DRAW_QUADS_2:
return index_len / 5 * 4;
case GX_DRAW_TRIANGLES:
return index_len / 4 * 3;
@@ -118,6 +119,7 @@ u32 VertexManager::GetRemainingIndices(int primitive)
switch (primitive)
{
case GX_DRAW_QUADS:
+ case GX_DRAW_QUADS_2:
return index_len / 6 * 4;
case GX_DRAW_TRIANGLES:
return index_len;