forked from dolphin-emu/dolphin
		
	This frees up 21 bits and allows us to shorten the UID struct by an entire 32 bits. It's not strictly needed (as it's encoded into the length) but I added a bit for per-pixel lighiting to make my life easier in the following commits.
		
			
				
	
	
		
			118 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Copyright 2008 Dolphin Emulator Project
 | 
						|
// Licensed under GPLv2+
 | 
						|
// Refer to the license.txt file included.
 | 
						|
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include <cstring>
 | 
						|
#include <functional>  // for hash
 | 
						|
 | 
						|
#include "Common/CommonTypes.h"
 | 
						|
#include "Common/Hash.h"
 | 
						|
#include "Common/NonCopyable.h"
 | 
						|
 | 
						|
// m_components
 | 
						|
enum
 | 
						|
{
 | 
						|
  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_COL_SHIFT = 13,
 | 
						|
  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,
 | 
						|
};
 | 
						|
 | 
						|
enum VarType
 | 
						|
{
 | 
						|
  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
 | 
						|
};
 | 
						|
 | 
						|
struct AttributeFormat
 | 
						|
{
 | 
						|
  VarType type;
 | 
						|
  int components;
 | 
						|
  int offset;
 | 
						|
  bool enable;
 | 
						|
  bool integer;
 | 
						|
};
 | 
						|
 | 
						|
struct PortableVertexDeclaration
 | 
						|
{
 | 
						|
  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;
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
namespace std
 | 
						|
{
 | 
						|
template <>
 | 
						|
struct hash<PortableVertexDeclaration>
 | 
						|
{
 | 
						|
  size_t operator()(const PortableVertexDeclaration& decl) const
 | 
						|
  {
 | 
						|
    return HashFletcher((u8*)&decl, sizeof(decl));
 | 
						|
  }
 | 
						|
};
 | 
						|
}
 | 
						|
 | 
						|
// The implementation of this class is specific for GL/DX, so NativeVertexFormat.cpp
 | 
						|
// is in the respective backend, not here in VideoCommon.
 | 
						|
 | 
						|
// Note that this class can't just invent arbitrary vertex formats out of its input -
 | 
						|
// all the data loading code must always be made compatible.
 | 
						|
class NativeVertexFormat : NonCopyable
 | 
						|
{
 | 
						|
public:
 | 
						|
  virtual ~NativeVertexFormat() {}
 | 
						|
  virtual void SetupVertexPointers() = 0;
 | 
						|
 | 
						|
  u32 GetVertexStride() const { return vtx_decl.stride; }
 | 
						|
  const PortableVertexDeclaration& GetVertexDeclaration() const { return vtx_decl; }
 | 
						|
protected:
 | 
						|
  // Let subclasses construct.
 | 
						|
  NativeVertexFormat() {}
 | 
						|
  PortableVertexDeclaration vtx_decl;
 | 
						|
};
 |