| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2008 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | // 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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 16:13:54 -04:00
										 |  |  | #include <cstring>
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | #include <functional>  // for hash
 | 
					
						
							| 
									
										
										
										
											2014-10-21 02:01:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 16:13:54 -04:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2014-08-27 22:37:08 -04:00
										 |  |  | #include "Common/Hash.h"
 | 
					
						
							| 
									
										
										
										
											2015-09-26 16:13:54 -04:00
										 |  |  | #include "Common/NonCopyable.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // m_components
 | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | enum | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02: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), | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-15 17:51:54 +13:00
										 |  |  |   VB_COL_SHIFT = 13, | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   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, | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-13 21:18:04 +00:00
										 |  |  | enum VarType | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02: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 | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   VarType type; | 
					
						
							|  |  |  |   int components; | 
					
						
							|  |  |  |   int offset; | 
					
						
							|  |  |  |   bool enable; | 
					
						
							|  |  |  |   bool integer; | 
					
						
							| 
									
										
										
										
											2014-01-24 14:46:05 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | struct PortableVertexDeclaration | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   int stride; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   AttributeFormat position; | 
					
						
							|  |  |  |   AttributeFormat normals[3]; | 
					
						
							|  |  |  |   AttributeFormat colors[2]; | 
					
						
							|  |  |  |   AttributeFormat texcoords[8]; | 
					
						
							|  |  |  |   AttributeFormat posmtx; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   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> | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   size_t operator()(const PortableVertexDeclaration& decl) const | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return HashFletcher((u8*)&decl, sizeof(decl)); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-08-27 22:37:08 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   virtual ~NativeVertexFormat() {} | 
					
						
							|  |  |  |   virtual void SetupVertexPointers() = 0; | 
					
						
							| 
									
										
										
										
											2009-02-28 22:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   u32 GetVertexStride() const { return vtx_decl.stride; } | 
					
						
							|  |  |  |   const PortableVertexDeclaration& GetVertexDeclaration() const { return vtx_decl; } | 
					
						
							| 
									
										
										
										
											2009-02-28 16:33:59 +00:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   // Let subclasses construct.
 | 
					
						
							|  |  |  |   NativeVertexFormat() {} | 
					
						
							|  |  |  |   PortableVertexDeclaration vtx_decl; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | }; |