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.
This commit is contained in:
parent
2983ae2823
commit
39d439fc48
|
@ -27,8 +27,11 @@ namespace OpcodeDecoder
|
||||||
#define GX_PRIMITIVE_SHIFT 3
|
#define GX_PRIMITIVE_SHIFT 3
|
||||||
#define GX_VAT_MASK 0x07
|
#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 0x0 //0x80
|
||||||
|
#define GX_DRAW_QUADS_2 0x1 //0x88
|
||||||
#define GX_DRAW_TRIANGLES 0x2 //0x90
|
#define GX_DRAW_TRIANGLES 0x2 //0x90
|
||||||
#define GX_DRAW_TRIANGLE_STRIP 0x3 //0x98
|
#define GX_DRAW_TRIANGLE_STRIP 0x3 //0x98
|
||||||
#define GX_DRAW_TRIANGLE_FAN 0x4 //0xA0
|
#define GX_DRAW_TRIANGLE_FAN 0x4 //0xA0
|
||||||
|
|
|
@ -25,6 +25,7 @@ void SetupUnit::SetupVertex()
|
||||||
switch (m_PrimType)
|
switch (m_PrimType)
|
||||||
{
|
{
|
||||||
case GX_DRAW_QUADS:
|
case GX_DRAW_QUADS:
|
||||||
|
case GX_DRAW_QUADS_2:
|
||||||
SetupQuad();
|
SetupQuad();
|
||||||
break;
|
break;
|
||||||
case GX_DRAW_TRIANGLES:
|
case GX_DRAW_TRIANGLES:
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include "Common/Common.h"
|
#include "Common/Common.h"
|
||||||
#include "VideoCommon/IndexGenerator.h"
|
#include "VideoCommon/IndexGenerator.h"
|
||||||
|
#include "VideoCommon/OpcodeDecoding.h"
|
||||||
#include "VideoCommon/VideoConfig.h"
|
#include "VideoCommon/VideoConfig.h"
|
||||||
|
|
||||||
//Init
|
//Init
|
||||||
|
@ -21,22 +22,23 @@ void IndexGenerator::Init()
|
||||||
{
|
{
|
||||||
if (g_Config.backend_info.bSupportsPrimitiveRestart)
|
if (g_Config.backend_info.bSupportsPrimitiveRestart)
|
||||||
{
|
{
|
||||||
primitive_table[0] = IndexGenerator::AddQuads<true>;
|
primitive_table[GX_DRAW_QUADS] = IndexGenerator::AddQuads<true>;
|
||||||
primitive_table[2] = IndexGenerator::AddList<true>;
|
primitive_table[GX_DRAW_QUADS_2] = IndexGenerator::AddQuads<true>;
|
||||||
primitive_table[3] = IndexGenerator::AddStrip<true>;
|
primitive_table[GX_DRAW_TRIANGLES] = IndexGenerator::AddList<true>;
|
||||||
primitive_table[4] = IndexGenerator::AddFan<true>;
|
primitive_table[GX_DRAW_TRIANGLE_STRIP] = IndexGenerator::AddStrip<true>;
|
||||||
|
primitive_table[GX_DRAW_TRIANGLE_FAN] = IndexGenerator::AddFan<true>;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
primitive_table[0] = IndexGenerator::AddQuads<false>;
|
primitive_table[GX_DRAW_QUADS] = IndexGenerator::AddQuads<false>;
|
||||||
primitive_table[2] = IndexGenerator::AddList<false>;
|
primitive_table[GX_DRAW_QUADS_2] = IndexGenerator::AddQuads<false>;
|
||||||
primitive_table[3] = IndexGenerator::AddStrip<false>;
|
primitive_table[GX_DRAW_TRIANGLES] = IndexGenerator::AddList<false>;
|
||||||
primitive_table[4] = IndexGenerator::AddFan<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[GX_DRAW_LINES] = &IndexGenerator::AddLineList;
|
||||||
primitive_table[5] = &IndexGenerator::AddLineList;
|
primitive_table[GX_DRAW_LINE_STRIP] = &IndexGenerator::AddLineStrip;
|
||||||
primitive_table[6] = &IndexGenerator::AddLineStrip;
|
primitive_table[GX_DRAW_POINTS] = &IndexGenerator::AddPoints;
|
||||||
primitive_table[7] = &IndexGenerator::AddPoints;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IndexGenerator::Start(u16* Indexptr)
|
void IndexGenerator::Start(u16* Indexptr)
|
||||||
|
|
|
@ -22,15 +22,17 @@
|
||||||
#define GX_PRIMITIVE_SHIFT 3
|
#define GX_PRIMITIVE_SHIFT 3
|
||||||
#define GX_VAT_MASK 0x07
|
#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 0x0 // 0x80
|
||||||
|
#define GX_DRAW_QUADS_2 0x1 // 0x88
|
||||||
#define GX_DRAW_TRIANGLES 0x2 // 0x90
|
#define GX_DRAW_TRIANGLES 0x2 // 0x90
|
||||||
#define GX_DRAW_TRIANGLE_STRIP 0x3 // 0x98
|
#define GX_DRAW_TRIANGLE_STRIP 0x3 // 0x98
|
||||||
#define GX_DRAW_TRIANGLE_FAN 0x4 // 0xA0
|
#define GX_DRAW_TRIANGLE_FAN 0x4 // 0xA0
|
||||||
#define GX_DRAW_LINES 0x5 // 0xA8
|
#define GX_DRAW_LINES 0x5 // 0xA8
|
||||||
#define GX_DRAW_LINE_STRIP 0x6 // 0xB0
|
#define GX_DRAW_LINE_STRIP 0x6 // 0xB0
|
||||||
#define GX_DRAW_POINTS 0x7 // 0xB8
|
#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;
|
extern bool g_bRecordFifoData;
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ bool VertexManager::IsFlushed;
|
||||||
|
|
||||||
static const PrimitiveType primitive_from_gx[8] = {
|
static const PrimitiveType primitive_from_gx[8] = {
|
||||||
PRIMITIVE_TRIANGLES, // GX_DRAW_QUADS
|
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_TRIANGLES
|
||||||
PRIMITIVE_TRIANGLES, // GX_DRAW_TRIANGLE_STRIP
|
PRIMITIVE_TRIANGLES, // GX_DRAW_TRIANGLE_STRIP
|
||||||
PRIMITIVE_TRIANGLES, // GX_DRAW_TRIANGLE_FAN
|
PRIMITIVE_TRIANGLES, // GX_DRAW_TRIANGLE_FAN
|
||||||
|
@ -93,6 +93,7 @@ u32 VertexManager::GetRemainingIndices(int primitive)
|
||||||
switch (primitive)
|
switch (primitive)
|
||||||
{
|
{
|
||||||
case GX_DRAW_QUADS:
|
case GX_DRAW_QUADS:
|
||||||
|
case GX_DRAW_QUADS_2:
|
||||||
return index_len / 5 * 4;
|
return index_len / 5 * 4;
|
||||||
case GX_DRAW_TRIANGLES:
|
case GX_DRAW_TRIANGLES:
|
||||||
return index_len / 4 * 3;
|
return index_len / 4 * 3;
|
||||||
|
@ -118,6 +119,7 @@ u32 VertexManager::GetRemainingIndices(int primitive)
|
||||||
switch (primitive)
|
switch (primitive)
|
||||||
{
|
{
|
||||||
case GX_DRAW_QUADS:
|
case GX_DRAW_QUADS:
|
||||||
|
case GX_DRAW_QUADS_2:
|
||||||
return index_len / 6 * 4;
|
return index_len / 6 * 4;
|
||||||
case GX_DRAW_TRIANGLES:
|
case GX_DRAW_TRIANGLES:
|
||||||
return index_len;
|
return index_len;
|
||||||
|
|
Loading…
Reference in New Issue