2008-07-12 17:40:22 +00:00
|
|
|
// Copyright (C) 2003-2008 Dolphin Project.
|
|
|
|
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, version 2.0.
|
|
|
|
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License 2.0 for more details.
|
|
|
|
|
|
|
|
// A copy of the GPL 2.0 should have been included with the program.
|
|
|
|
// If not, see http://www.gnu.org/licenses/
|
|
|
|
|
|
|
|
// Official SVN repository and contact information can be found at
|
|
|
|
// http://code.google.com/p/dolphin-emu/
|
|
|
|
|
|
|
|
#ifndef _VERTEXLOADER_H
|
|
|
|
#define _VERTEXLOADER_H
|
|
|
|
|
2008-07-17 20:29:04 +00:00
|
|
|
#include "CPMemory.h"
|
2008-09-29 17:29:25 +00:00
|
|
|
#include "DataReader.h"
|
2008-07-12 17:40:22 +00:00
|
|
|
|
2008-10-24 23:08:46 +00:00
|
|
|
#include "NativeVertexFormat.h"
|
2008-07-12 17:40:22 +00:00
|
|
|
|
2008-10-25 15:53:43 +00:00
|
|
|
class VertexLoaderUID
|
2008-07-12 17:40:22 +00:00
|
|
|
{
|
2008-10-25 17:47:46 +00:00
|
|
|
u32 vid[5];
|
2008-07-12 17:40:22 +00:00
|
|
|
public:
|
2008-10-25 15:53:43 +00:00
|
|
|
VertexLoaderUID() {}
|
|
|
|
void InitFromCurrentState(int vtx_attr_group) {
|
2008-10-25 17:47:46 +00:00
|
|
|
vid[0] = g_VtxDesc.Hex & 0xFFFFFFFF;
|
|
|
|
vid[1] = g_VtxDesc.Hex >> 32;
|
|
|
|
vid[2] = g_VtxAttr[vtx_attr_group].g0.Hex & ~VAT_0_FRACBITS;
|
|
|
|
vid[3] = g_VtxAttr[vtx_attr_group].g1.Hex & ~VAT_1_FRACBITS;
|
|
|
|
vid[4] = g_VtxAttr[vtx_attr_group].g2.Hex & ~VAT_2_FRACBITS;
|
2008-10-25 15:53:43 +00:00
|
|
|
}
|
|
|
|
bool operator < (const VertexLoaderUID &other) const {
|
2008-10-25 17:47:46 +00:00
|
|
|
if (vid[0] < other.vid[0])
|
2008-10-25 15:53:43 +00:00
|
|
|
return true;
|
2008-10-25 17:47:46 +00:00
|
|
|
else if (vid[0] > other.vid[0])
|
2008-10-25 15:53:43 +00:00
|
|
|
return false;
|
|
|
|
for (int i = 1; i < 5; ++i) {
|
2008-10-25 17:47:46 +00:00
|
|
|
if (vid[i] < other.vid[i])
|
2008-10-25 15:53:43 +00:00
|
|
|
return true;
|
2008-10-25 17:47:46 +00:00
|
|
|
else if (vid[i] > other.vid[i])
|
2008-10-25 15:53:43 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
};
|
2008-07-12 17:40:22 +00:00
|
|
|
|
2008-10-25 15:53:43 +00:00
|
|
|
class VertexLoader
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
VertexLoader(const TVtxDesc &vtx_desc, const VAT &vtx_attr);
|
|
|
|
~VertexLoader();
|
2008-07-12 17:40:22 +00:00
|
|
|
|
2008-10-25 15:53:43 +00:00
|
|
|
int GetVertexSize() const {return m_VertexSize;}
|
|
|
|
void RunVertices(int vtx_attr_group, int primitive, int count);
|
2008-10-17 21:05:23 +00:00
|
|
|
|
2008-10-25 15:53:43 +00:00
|
|
|
private:
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
NRM_ZERO = 0,
|
|
|
|
NRM_ONE = 1,
|
|
|
|
NRM_THREE = 3,
|
|
|
|
};
|
2008-10-25 13:27:28 +00:00
|
|
|
|
2008-11-23 00:12:44 +00:00
|
|
|
int m_VertexSize; // number of bytes of a raw GC vertex. Computed by CompileVertexTranslator.
|
2008-07-12 17:40:22 +00:00
|
|
|
|
2008-10-25 15:53:43 +00:00
|
|
|
// GC vertex format
|
|
|
|
TVtxAttr m_VtxAttr; // VAT decoded into easy format
|
|
|
|
TVtxDesc m_VtxDesc; // Not really used currently - or well it is, but could be easily avoided.
|
2008-07-12 17:40:22 +00:00
|
|
|
|
2008-10-25 15:53:43 +00:00
|
|
|
// PC vertex format
|
2008-10-27 21:38:30 +00:00
|
|
|
NativeVertexFormat *m_NativeFmt;
|
2008-10-28 21:04:14 +00:00
|
|
|
int native_stride;
|
2008-10-24 23:08:46 +00:00
|
|
|
|
2008-10-25 12:35:55 +00:00
|
|
|
// Pipeline. To be JIT compiled in the future.
|
2008-10-25 15:53:43 +00:00
|
|
|
TPipelineFunction m_PipelineStages[32]; // TODO - figure out real max. it's lower.
|
2008-10-25 12:35:55 +00:00
|
|
|
int m_numPipelineStages;
|
|
|
|
|
2008-11-23 17:46:14 +00:00
|
|
|
u8 *m_compiledCode;
|
|
|
|
|
2008-10-25 15:53:43 +00:00
|
|
|
void SetupColor(int num, int _iMode, int _iFormat, int _iElements);
|
|
|
|
void SetupTexCoord(int num, int _iMode, int _iFormat, int _iElements, int _iFrac);
|
2008-07-12 17:40:22 +00:00
|
|
|
|
2008-10-25 15:53:43 +00:00
|
|
|
void SetVAT(u32 _group0, u32 _group1, u32 _group2);
|
|
|
|
|
|
|
|
void CompileVertexTranslator();
|
|
|
|
|
|
|
|
void WriteCall(TPipelineFunction);
|
2008-07-12 17:40:22 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|