| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | // Copyright 2013 Dolphin Emulator Project
 | 
					
						
							|  |  |  | // Licensed under GPLv2
 | 
					
						
							|  |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-27 22:37:08 -04:00
										 |  |  | #include "Common/Hash.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // m_components
 | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | enum | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 	VB_HAS_POSMTXIDX =(1<<1), | 
					
						
							|  |  |  | 	VB_HAS_TEXMTXIDX0=(1<<2), | 
					
						
							|  |  |  | 	VB_HAS_TEXMTXIDX1=(1<<3), | 
					
						
							|  |  |  | 	VB_HAS_TEXMTXIDX2=(1<<4), | 
					
						
							|  |  |  | 	VB_HAS_TEXMTXIDX3=(1<<5), | 
					
						
							|  |  |  | 	VB_HAS_TEXMTXIDX4=(1<<6), | 
					
						
							|  |  |  | 	VB_HAS_TEXMTXIDX5=(1<<7), | 
					
						
							|  |  |  | 	VB_HAS_TEXMTXIDX6=(1<<8), | 
					
						
							|  |  |  | 	VB_HAS_TEXMTXIDX7=(1<<9), | 
					
						
							|  |  |  | 	VB_HAS_TEXMTXIDXALL=(0xff<<2), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//VB_HAS_POS=0, // Implied, it always has pos! don't bother testing
 | 
					
						
							|  |  |  | 	VB_HAS_NRM0=(1<<10), | 
					
						
							|  |  |  | 	VB_HAS_NRM1=(1<<11), | 
					
						
							|  |  |  | 	VB_HAS_NRM2=(1<<12), | 
					
						
							|  |  |  | 	VB_HAS_NRMALL=(7<<10), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	VB_HAS_COL0=(1<<13), | 
					
						
							|  |  |  | 	VB_HAS_COL1=(1<<14), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	VB_HAS_UV0=(1<<15), | 
					
						
							|  |  |  | 	VB_HAS_UV1=(1<<16), | 
					
						
							|  |  |  | 	VB_HAS_UV2=(1<<17), | 
					
						
							|  |  |  | 	VB_HAS_UV3=(1<<18), | 
					
						
							|  |  |  | 	VB_HAS_UV4=(1<<19), | 
					
						
							|  |  |  | 	VB_HAS_UV5=(1<<20), | 
					
						
							|  |  |  | 	VB_HAS_UV6=(1<<21), | 
					
						
							|  |  |  | 	VB_HAS_UV7=(1<<22), | 
					
						
							|  |  |  | 	VB_HAS_UVALL=(0xff<<15), | 
					
						
							|  |  |  | 	VB_HAS_UVTEXMTXSHIFT=13, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-31 01:53:57 +00:00
										 |  |  | #ifdef WIN32
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | #define LOADERDECL __cdecl
 | 
					
						
							| 
									
										
										
										
											2011-01-31 01:53:57 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #define LOADERDECL
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | typedef void (LOADERDECL *TPipelineFunction)(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-13 21:18:04 +00:00
										 |  |  | enum VarType | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-01-24 14:18:55 +01:00
										 |  |  | 	VAR_UNSIGNED_BYTE,  // GX_U8  = 0
 | 
					
						
							|  |  |  | 	VAR_BYTE,           // GX_S8  = 1
 | 
					
						
							|  |  |  | 	VAR_UNSIGNED_SHORT, // GX_U16 = 2
 | 
					
						
							|  |  |  | 	VAR_SHORT,          // GX_S16 = 3
 | 
					
						
							|  |  |  | 	VAR_FLOAT,          // GX_F32 = 4
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-24 14:46:05 +01:00
										 |  |  | struct AttributeFormat | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	VarType type; | 
					
						
							|  |  |  | 	int components; | 
					
						
							|  |  |  | 	int offset; | 
					
						
							|  |  |  | 	bool enable; | 
					
						
							|  |  |  | 	bool integer; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | struct PortableVertexDeclaration | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int stride; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-24 14:46:05 +01:00
										 |  |  | 	AttributeFormat position; | 
					
						
							| 
									
										
										
										
											2014-01-24 15:16:52 +01:00
										 |  |  | 	AttributeFormat normals[3]; | 
					
						
							| 
									
										
										
										
											2014-01-24 15:23:50 +01:00
										 |  |  | 	AttributeFormat colors[2]; | 
					
						
							| 
									
										
										
										
											2014-01-24 15:32:27 +01:00
										 |  |  | 	AttributeFormat texcoords[8]; | 
					
						
							| 
									
										
										
										
											2014-01-24 15:41:08 +01:00
										 |  |  | 	AttributeFormat posmtx; | 
					
						
							| 
									
										
										
										
											2014-06-05 17:55:21 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	inline bool operator<(const PortableVertexDeclaration& b) const | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return memcmp(this, &b, sizeof(PortableVertexDeclaration)) < 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	inline bool operator==(const PortableVertexDeclaration& b) const | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return memcmp(this, &b, sizeof(PortableVertexDeclaration)) == 0; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-27 22:37:08 -04:00
										 |  |  | namespace std | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <> | 
					
						
							|  |  |  | struct hash<PortableVertexDeclaration> | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	size_t operator()(const PortableVertexDeclaration& decl) const | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return HashFletcher((u8 *) &decl, sizeof(decl)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | // The implementation of this class is specific for GL/DX, so NativeVertexFormat.cpp
 | 
					
						
							| 
									
										
										
										
											2011-02-14 02:18:03 +00:00
										 |  |  | // is in the respective backend, not here in VideoCommon.
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | // Note that this class can't just invent arbitrary vertex formats out of its input -
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | // all the data loading code must always be made compatible.
 | 
					
						
							| 
									
										
										
										
											2010-11-15 05:29:10 +00:00
										 |  |  | class NativeVertexFormat : NonCopyable | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2008-12-25 15:56:36 +00:00
										 |  |  | 	virtual ~NativeVertexFormat() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual void Initialize(const PortableVertexDeclaration &vtx_decl) = 0; | 
					
						
							| 
									
										
										
										
											2011-01-24 11:57:17 +00:00
										 |  |  | 	virtual void SetupVertexPointers() = 0; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-26 11:34:02 -03:00
										 |  |  | 	u32 GetVertexStride() const { return vertex_stride; } | 
					
						
							| 
									
										
										
										
											2009-02-28 22:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-26 09:25:08 +00:00
										 |  |  | 	// TODO: move this under private:
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 	u32 m_components;  // VB_HAS_X. Bitmask telling what vertex components are present.
 | 
					
						
							| 
									
										
										
										
											2009-02-28 16:33:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  | 	// Let subclasses construct.
 | 
					
						
							|  |  |  | 	NativeVertexFormat() {} | 
					
						
							| 
									
										
										
										
											2010-11-26 09:25:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	u32 vertex_stride; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | }; |