//////////////////////////////////////////////////////////////////////////////
//
// Asura_PS3_RSXProfiling.h
//
// Copyright (c) 2007 Rebellion. All rights reserved.
//
//////////////////////////////////////////////////////////////////////////////

// B E G I N   F I L E   W R A P P E R ///////////////////////////////////////

#ifdef ASURA_USE_PRAGMA_ONCE
    #pragma once
#endif

#ifndef ASURA_PS3_RSXPROFILING_H___
#define ASURA_PS3_RSXPROFILING_H___ 1


// M A C R O S ///////////////////////////////////////////////////////////////

//BW wrt Asura_Platform_CPUProfile.h (PS3)
#ifdef ASURA_USE_GCM_REPLAY

	#define ASURA_PS3_RSX_PROFILE__BEGIN( id, name )										\
	{																						\
		cellGcmSetPerfMonPushMarker( Asura_PS3_Graphics::GetGcmCurrentContext(), name );	\
		Asura_PS3_RSXProfiling::BeginSection( id );											\
	}
	
	#define ASURA_PS3_RSX_PROFILE__END( id )												\
	{																						\
		cellGcmSetPerfMonPopMarker( Asura_PS3_Graphics::GetGcmCurrentContext() );			\
		Asura_PS3_RSXProfiling::EndSection( id );											\
	}

#else

	#define ASURA_PS3_RSX_PROFILE__BEGIN( id, name )										\
	{																						\
		Asura_PS3_RSXProfiling::BeginSection( id );											\
	}
	
	#define ASURA_PS3_RSX_PROFILE__END( id )												\
	{																						\
		Asura_PS3_RSXProfiling::EndSection( id );											\
	}

#endif

enum Asura_PS3_RSXProfileIndex
{
	ASURA_PS3_RSX_PROFILE__ENTIREFRAME   = 0,

	ASURA_PS3_RSX_PROFILE__SKYBOX        = 1,
	ASURA_PS3_RSX_PROFILE__ENV           = 2,
	ASURA_PS3_RSX_PROFILE__SMOOTHSKIN    = 3,
	ASURA_PS3_RSX_PROFILE__OBJHIER       = 4,
	ASURA_PS3_RSX_PROFILE__BOTANICALS    = 5,
	ASURA_PS3_RSX_PROFILE__CARPET        = 6,
	ASURA_PS3_RSX_PROFILE__CREATESHADOWS = 7,
	ASURA_PS3_RSX_PROFILE__APPLYSHADOWS  = 8,
	ASURA_PS3_RSX_PROFILE__PHOTONS       = 9,
	ASURA_PS3_RSX_PROFILE__PROJECTORS    = 10,
	ASURA_PS3_RSX_PROFILE__FOG           = 11,
	ASURA_PS3_RSX_PROFILE__PFX           = 12,
	ASURA_PS3_RSX_PROFILE__FSFX          = 13,
	ASURA_PS3_RSX_PROFILE__2D            = 14,
	ASURA_PS3_RSX_PROFILE__BFRRESOLVES   = 15,

	ASURA_PS3_RSX_PROFILE__PROJECTSPECIFIC_0,
	ASURA_PS3_RSX_PROFILE__PROJECTSPECIFIC_1,
	ASURA_PS3_RSX_PROFILE__PROJECTSPECIFIC_2,
	ASURA_PS3_RSX_PROFILE__PROJECTSPECIFIC_3,
	ASURA_PS3_RSX_PROFILE__PROJECTSPECIFIC_4,
	ASURA_PS3_RSX_PROFILE__PROJECTSPECIFIC_5,
	ASURA_PS3_RSX_PROFILE__PROJECTSPECIFIC_6,
	ASURA_PS3_RSX_PROFILE__PROJECTSPECIFIC_7,

	ASURA_PS3_RSX_PROFILE__MISC,

	ASURA_PS3_RSX_PROFILE__NUMINDICES,
};



// C L A S S E S /////////////////////////////////////////////////////////////

struct CellGcmContextData;

class Asura_PS3_RSXProfiling
{

public:

#ifndef ASURA_PS3_USE_GPU_PROFILE_BARS

    static void BeginSection( Asura_PS3_RSXProfileIndex eProfileIndex ) { }
    static void EndSection( Asura_PS3_RSXProfileIndex eProfileIndex ) { }

#else

    static void Initialise( void );
    static void Shutdown( void );

    static void BeginFrame( void );
    static void EndFrame( void );

    static void BeginSection( Asura_PS3_RSXProfileIndex eProfileIndex );
    static void EndSection( Asura_PS3_RSXProfileIndex eProfileIndex );

    static void RenderBars( void );

private:

    static bool WriteTimerCmds( CellGcmContextData* pxContext, u_int uProfileIdx, bool bIsBeginSection );

#endif

};

// E N D   F I L E   W R A P P E R ///////////////////////////////////////////

#endif // #ifndef ASURA_PS3_RSXPROFILING_H___
