forked from dolphin-emu/dolphin
		
	
		
			
				
	
	
		
			77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2013 Dolphin Emulator Project
 | |
| // Licensed under GPLv2
 | |
| // Refer to the license.txt file included.
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include "VideoCommon/VideoCommon.h"
 | |
| 
 | |
| namespace EfbInterface
 | |
| {
 | |
| 	const int DEPTH_BUFFER_START = EFB_WIDTH * EFB_HEIGHT * 3;
 | |
| 
 | |
| 	// xfb color format - packed so the compiler doesn't mess with alignment
 | |
| #pragma pack(push,1)
 | |
| 	struct yuv422_packed
 | |
| 	{
 | |
| 		u8 Y;
 | |
| 		u8 UV;
 | |
| 	};
 | |
| #pragma pack(pop)
 | |
| 
 | |
| 	// But this struct is only used internally, so we could optimise alignment
 | |
| 	struct yuv444
 | |
| 	{
 | |
| 		u8 Y;
 | |
| 		s8 U;
 | |
| 		s8 V;
 | |
| 	};
 | |
| 
 | |
| 	enum
 | |
| 	{
 | |
| 		ALP_C,
 | |
| 		BLU_C,
 | |
| 		GRN_C,
 | |
| 		RED_C
 | |
| 	};
 | |
| 
 | |
| 	// color order is ABGR in order to emulate RGBA on little-endian hardware
 | |
| 
 | |
| 	// does full blending of an incoming pixel
 | |
| 	void BlendTev(u16 x, u16 y, u8 *color);
 | |
| 
 | |
| 	// compare z at location x,y
 | |
| 	// writes it if it passes
 | |
| 	// returns result of compare.
 | |
| 	bool ZCompare(u16 x, u16 y, u32 z);
 | |
| 
 | |
| 	// sets the color and alpha
 | |
| 	void SetColor(u16 x, u16 y, u8 *color);
 | |
| 	void SetDepth(u16 x, u16 y, u32 depth);
 | |
| 
 | |
| 	void GetColor(u16 x, u16 y, u8 *color);
 | |
| 	void GetColorYUV(u16 x, u16 y, yuv444 *color);
 | |
| 	u32 GetDepth(u16 x, u16 y);
 | |
| 
 | |
| 	u8* GetPixelPointer(u16 x, u16 y, bool depth);
 | |
| 
 | |
| 	void CopyToXFB(yuv422_packed* xfb_in_ram, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc, float Gamma);
 | |
| 	void BypassXFB(u8* texture, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc, float Gamma);
 | |
| 
 | |
| 	void DoState(PointerWrap &p);
 | |
| 
 | |
| 	extern u32 perf_values[PQ_NUM_MEMBERS];
 | |
| 	inline void IncPerfCounterQuadCount(PerfQueryType type)
 | |
| 	{
 | |
| 		// NOTE: hardware doesn't process individual pixels but quads instead.
 | |
| 		// Current software renderer architecture works on pixels though, so
 | |
| 		// we have this "quad" hack here to only increment the registers on
 | |
| 		// every fourth rendered pixel
 | |
| 		static u32 quad[PQ_NUM_MEMBERS];
 | |
| 		if (++quad[type] != 3)
 | |
| 			return;
 | |
| 		quad[type] = 0;
 | |
| 		++perf_values[type];
 | |
| 	}
 | |
| }
 |