//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//
// This file defines a number of constants and structured which are used to build up a command
// buffer to pass to ShaderAPI for state setting and other operations.  Since the prupose of these
// command buffers is to minimize and optimize calls into shaderapi, their structure is not
// abstract - they are built out by the calling process.
//
//===========================================================================//

#ifndef COMMANDBUFFER_H
#define COMMANDBUFFER_H


#ifdef _WIN32
#pragma once
#endif

// all commands defined with their struct
enum CommandBufferCommand_t
{
	// flow control commands.
	CBCMD_END = 0,											// end of stream
	CBCMD_JUMP = 1,											// int cmd, void *adr. jump to another
															// stream. Can be used to implement
															// non-sequentially allocated storage
	CBCMD_JSR = 2,											// int cmd, void *adr. subroutine call to another stream.

	// constant setting commands
	CBCMD_SET_PIXEL_SHADER_FLOAT_CONST = 256, // int cmd,int first_reg, int nregs, float values[nregs*4]


	CBCMD_SET_VERTEX_SHADER_FLOAT_CONST = 257, // int cmd,int first_reg, int nregs, float values[nregs*4]
	CBCMD_SET_VERTEX_SHADER_FLOAT_CONST_REF = 258, // int cmd,int first_reg, int nregs, &float values[nregs*4]
	CBCMD_SETPIXELSHADERFOGPARAMS = 259,					// int cmd, int regdest
	CBCMD_STORE_EYE_POS_IN_PSCONST = 260,					// int cmd, int regdest
	CBCMD_COMMITPIXELSHADERLIGHTING = 261,					// int cmd, int regdest
	CBCMD_SETPIXELSHADERSTATEAMBIENTLIGHTCUBE = 262,		// int cmd, int regdest
	CBCMD_SETAMBIENTCUBEDYNAMICSTATEVERTEXSHADER = 263,		// int cmd
	CBCMD_SET_DEPTH_FEATHERING_CONST = 264,					// int cmd, int constant register, float blend scale

	// texture binding
	CBCMD_BIND_STANDARD_TEXTURE = 512,						// cmd, sampler, texture id
	CBCMD_BIND_SHADERAPI_TEXTURE_HANDLE = 513,				// cmd, sampler, texture handle

	// shaders
	CBCMD_SET_PSHINDEX = 1024,								// cmd, idx
	CBCMD_SET_VSHINDEX = 1025,								// cmd, idx

	// commands from mainline.   In mainline commands no longer have
	// command id's specified like this. So I make up numbers...
	CBCMD_SET_VERTEX_SHADER_FLASHLIGHT_STATE = 2000,		// cmd, int first_reg (for worldToTexture matrix)
	CBCMD_SET_PIXEL_SHADER_FLASHLIGHT_STATE = 2001,		    // cmd, int color reg, int atten reg, int origin reg, sampler (for flashlight texture)

	CBCMD_SET_PIXEL_SHADER_UBERLIGHT_STATE = 2002,			// cmd

	CBCMD_SET_VERTEX_SHADER_NEARZFARZ_STATE = 2003,		    // cmd

};

//-----------------------------------------------------------------------------
// Commands used by the per-instance command buffer
// NOTE: If you add commands, you probably want to change the size of 
// CInstanceStorageBuffer and/or the choice of making it a fixed-size allocation
// see shaderlib/baseshader.*
//
// FIXME!! NOTE that this whole scheme here generates a dependency of the
// shaders on internal guts of shaderapidx8, since it's responsible for
// setting various pixel shader + vertex shader constants based on the
// commands below. We need to remove this dependency as it's way too restrictive
// and puts the smarts in the wrong place (see CBICMD_SETPIXELSHADERGLINTDAMPING
// as an example). Not going to solve this for l4d though, as I don't anticipate
// a large amount of new shader writing for that product.
//-----------------------------------------------------------------------------
enum CommandBufferInstanceCommand_t
{
	CBICMD_END = 0,										// end of stream
	CBICMD_JUMP,										// int cmd, void *adr. jump to another
	// stream. Can be used to implement
	// non-sequentially allocated storage
	CBICMD_JSR,											// int cmd, void *adr. subroutine call to another stream.

	CBICMD_SETSKINNINGMATRICES,							// int cmd

	CBICMD_SETVERTEXSHADERLOCALLIGHTING,				// int cmd
	CBICMD_SETPIXELSHADERLOCALLIGHTING,					// int cmd, int regdest
	CBICMD_SETVERTEXSHADERAMBIENTLIGHTCUBE,				// int cmd
	CBICMD_SETPIXELSHADERAMBIENTLIGHTCUBE,				// int cmd, int regdest
	CBICMD_SETPIXELSHADERAMBIENTLIGHTCUBELUMINANCE,		// int cmd, int regdest
	CBICMD_SETPIXELSHADERGLINTDAMPING,					// int cmd, int regdest

	CBICMD_BIND_ENV_CUBEMAP_TEXTURE,					// cmd, sampler

	CBICMD_SETMODULATIONPIXELSHADERDYNAMICSTATE,
	CBICMD_SETMODULATIONPIXELSHADERDYNAMICSTATE_LINEARCOLORSPACE_LINEARSCALE, // int cmd, int constant register, Vector color2
	CBICMD_SETMODULATIONPIXELSHADERDYNAMICSTATE_LINEARCOLORSPACE,			// int cmd, int constant register, Vector color2
	CBICMD_SETMODULATIONPIXELSHADERDYNAMICSTATE_LINEARSCALE,				// int cmd, int constant register, Vector color2, float scale
	CBICMD_SETMODULATIONVERTEXSHADERDYNAMICSTATE,							// int cmd, int constant register, Vector color2
	CBICMD_SETMODULATIONPIXELSHADERDYNAMICSTATE_IDENTITY,					// int cmd, int constant register
	CBICMD_SETMODULATIONVERTEXSHADERDYNAMICSTATE_LINEARSCALE,				// int cmd, int constant register, Vector color2, float scale
	// This must be last
	CBICMD_COUNT,
};

#endif // commandbuffer_h