text: /*
   * Copyright (C) 2008-2009  Advanced Micro Devices, Inc.
   *
   * Permission is hereby granted, free of charge, to any person obtaining a
   * copy of this software and associated documentation files (the "Software"),
   * to deal in the Software without restriction, including without limitation
   * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   * and/or sell copies of the Software, and to permit persons to whom the
   * Software is furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice shall be included
   * in all copies or substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
   * THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
   * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
   * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
   */
  
  /*
   * Authors:
   *   Richard Li <RichardZ.Li@amd.com>, <richardradeon@gmail.com>
   */
  
  
  #ifndef _R700_SHADERINST_H_
  #define _R700_SHADERINST_H_
  
  #include "main/glheader.h"
  
  #include "defaultendian.h" 
  #include "sq_micro_reg.h"
  
  #define SQ_ALU_CONSTANT_PS_OFFSET      0x00000000
  #define SQ_ALU_CONSTANT_PS_COUNT       0x00000100
  #define SQ_ALU_CONSTANT_VS_OFFSET      0x00000100
  #define SQ_ALU_CONSTANT_VS_COUNT       0x00000100
  #define SQ_FETCH_RESOURCE_PS_OFFSET    0x00000000
  #define SQ_FETCH_RESOURCE_PS_COUNT     0x000000a0
  #define SQ_FETCH_RESOURCE_VS_OFFSET    0x000000a0
  #define SQ_FETCH_RESOURCE_VS_COUNT     0x000000b0
  
  //richard dec.10 glsl
  #define SQ_TEX_SAMPLER_PS_OFFSET       0x00000000
  #define SQ_TEX_SAMPLER_PS_COUNT        0x00000012
  #define SQ_TEX_SAMPLER_VS_OFFSET       0x00000012
  #define SQ_TEX_SAMPLER_VS_COUNT        0x00000012
  //-------------------
  
  #define SHADERINST_TYPEMASK_CF  0x10
  #define SHADERINST_TYPEMASK_ALU 0x20
  #define SHADERINST_TYPEMASK_TEX 0x40
  #define SHADERINST_TYPEMASK_VTX 0x80
  
  typedef enum ShaderInstType 
  {
      SIT_CF = 0x10,            /*SIZE = 0x2*/
          SIT_CF_ALL_EXP = 0x14,    /*SIZE = 0x2, MAX_INSTRUCTIONS = 0x10;*/
              SIT_CF_ALL_EXP_SX = 0x15, /*SIZE = 0x2, MAX_INSTRUCTIONS = 0x10;*/
              SIT_CF_ALL_EXP_SMX= 0x16, /*SIZE = 0x2, MAX_INSTRUCTIONS = 0x10;*/
          SIT_CF_GENERIC = 0x18,    /*SIZE = 0x2, MAX_INSTRUCTIONS = 0x8;  //For tex and vtx*/
          SIT_CF_ALU = 0x19,        /*SIZE = 0x2, MAX_INSTRUCTIONS = 0x80;*/
      SIT_ALU = 0x20,           /*SIZE = 0x2,*/
          SIT_ALU_HALF_LIT = 0x21,  /*SIZE = 0x4,*/
          SIT_ALU_FALL_LIT = 0x22,  /*SIZE = 0x6,*/
      SIT_TEX = 0x40,           /*SIZE = 0x4,*/
      SIT_VTX = 0x80,           /*SIZE = 0x4, MEGA_FETCH_BYTES = 0x20*/
          SIT_VTX_GENERIC = 0x81,   /*SIZE = 0x4, MEGA_FETCH_BYTES = 0x20*/
          SIT_VTX_SEM = 0x82       /*SIZE = 0x4, MEGA_FETCH_BYTES = 0x20*/
  } ShaderInstType;
  
  typedef struct R700ShaderInstruction 
  {
      ShaderInstType m_ShaderInstType;
      struct R700ShaderInstruction *pNextInst;
      GLuint m_uIndex;
      GLuint useCount;
  } R700ShaderInstruction;
  
  // ------------------ CF insts ---------------------------
  
  typedef R700ShaderInstruction R700ControlFlowInstruction;
  
  typedef struct R700ControlFlowAllocExportClause  
  {
      ShaderInstType          m_ShaderInstType;
      R700ShaderInstruction * pNextInst;    
      GLuint m_uIndex;
      GLuint useCount;
  		
      sq_cf_alloc_export_word0_u      m_Word0;
      sq_cf_alloc_export_word1_u      m_Word1;
  } R700ControlFlowAllocExportClause;
  
  typedef struct R700ControlFlowSXClause 
  {
  	ShaderInstType          m_ShaderInstType;
  	R700ShaderInstruction * pNextInst;
  	//R700ControlFlowAllocExportClause
  		//R700ControlFlowInstruction 
  			//R700ShaderInstruction
  	GLuint m_uIndex;
      GLuint useCount;
  			//---------------------
  		//---------------------------
      sq_cf_alloc_export_word0_u      m_Word0;
      sq_cf_alloc_export_word1_u      m_Word1;
  	//-------------------------------------
  
      sq_cf_alloc_export_word1_swiz_u m_Word1_SWIZ;
  } R700ControlFlowSXClause;
  
  typedef struct R700ControlFlowSMXClause 
  {
  	ShaderInstType          m_ShaderInstType;
  	R700ShaderInstruction * pNextInst;
      //R700ControlFlowAllocExportClause
  		//R700ControlFlowInstruction 
  			//R700ShaderInstruction
  	GLuint m_uIndex;
      GLuint useCount;
  			//---------------------
  		//---------------------------
      sq_cf_alloc_export_word0_u      m_Word0;
      sq_cf_alloc_export_word1_u      m_Word1;
  	//-------------------------------
  
      sq_cf_alloc_export_word1_buf_u m_Word1_BUF;
  } R700ControlFlowSMXClause;
  
  typedef struct R700ControlFlowGenericClause 
  {
  	ShaderInstType          m_ShaderInstType;
  	R700ShaderInstruction * pNextInst;
  	//R700ControlFlowInstruction
  		//R700ShaderInstruction
  	GLuint m_uIndex;
      GLuint useCount;
  		//---------------------
  	//---------------------
  
      sq_cf_word0_u m_Word0;
      sq_cf_word1_u m_Word1;
  
      struct R700VertexInstruction  *m_pLinkedVTXInstruction;
      struct R700TextureInstruction *m_pLinkedTEXInstruction;
  } R700ControlFlowGenericClause;
  
  typedef struct R700ControlFlowALUClause 
  {
  	ShaderInstType          m_ShaderInstType;
  	R700ShaderInstruction * pNextInst;
      //R700ControlFlowInstruction
  		//R700ShaderInstruction
  	GLuint m_uIndex;
      GLuint useCount;
  		//---------------------
  	//---------------------
  
      sq_cf_alu_word0_u m_Word0;
      sq_cf_alu_word1_u m_Word1;
      
      struct R700ALUInstruction *m_pLinkedALUInstruction;
  } R700ControlFlowALUClause;
  
  // ------------------- End of CF Inst ------------------------
  
  // ------------------- ALU Inst ------------------------------
  typedef struct R700ALUInstruction 
  {
  	ShaderInstType          m_ShaderInstType;
  	R700ShaderInstruction * pNextInst;
  	//R700ShaderInstruction
  	GLuint m_uIndex;
      GLuint useCount;
  	//---------------------
  
      sq_alu_word0_u     m_Word0;
      sq_alu_word1_u     m_Word1;
      sq_alu_word1_op2_v2_u m_Word1_OP2;
      sq_alu_word1_op3_u m_Word1_OP3;
  
      struct R700ControlFlowALUClause *m_pLinkedALUClause;
  } R700ALUInstruction;
  
  typedef struct R700ALUInstructionHalfLiteral
  {
  	ShaderInstType          m_ShaderInstType;
  	R700ShaderInstruction * pNextInst;
  	//R700ALUInstruction 
  		//R700ShaderInstruction
  	GLuint m_uIndex;
      GLuint useCount;
  		//---------------------
  
      sq_alu_word0_u     m_Word0;
      sq_alu_word1_u     m_Word1;
      sq_alu_word1_op2_v2_u m_Word1_OP2;
      sq_alu_word1_op3_u m_Word1_OP3;
  
      struct R700ControlFlowALUClause *m_pLinkedALUClause;
  	//-------------------
  
      GLfloat m_fLiteralX,
              m_fLiteralY;
  } R700ALUInstructionHalfLiteral;
  
  typedef struct R700ALUInstructionFullLiteral 
  {
  	ShaderInstType          m_ShaderInstType;
  	R700ShaderInstruction * pNextInst;
  	//R700ALUInstruction 
  		//R700ShaderInstruction
  	GLuint m_uIndex;
      GLuint useCount;
  		//---------------------
  
      sq_alu_word0_u     m_Word0;
      sq_alu_word1_u     m_Word1;
      sq_alu_word1_op2_v2_u m_Word1_OP2;
      sq_alu_word1_op3_u m_Word1_OP3;
  
      struct R700ControlFlowALUClause *m_pLinkedALUClause;
  	//-------------------
  
      GLfloat m_fLiteralX,
              m_fLiteralY,
              m_fLiteralZ,
              m_fLiteralW;
  } R700ALUInstructionFullLiteral;
  // ------------------- End of ALU Inst -----------------------
  
  // ------------------- Textuer/Vertex Instruction --------------------
  
  typedef struct R700TextureInstruction 
  {
  	ShaderInstType          m_ShaderInstType;
  	R700ShaderInstruction * pNextInst;
  	//R700ShaderInstruction
  	GLuint m_uIndex;
      GLuint useCount;
  	//---------------------
  	
      sq_tex_word0_u m_Word0;
      sq_tex_word1_u m_Word1;
      sq_tex_word2_u m_Word2;
  
      struct R700ControlFlowGenericClause *m_pLinkedGenericClause;
  } R700TextureInstruction;
  
  typedef struct R700VertexInstruction 
  {
  	ShaderInstType          m_ShaderInstType;
  	R700ShaderInstruction * pNextInst;
  	//R700ShaderInstruction
  	GLuint m_uIndex;
      GLuint useCount;
  	//---------------------
  	
      sq_vtx_word0_u     m_Word0;
      sq_vtx_word1_u     m_Word1;
      sq_vtx_word2_u     m_Word2;
  
      struct R700ControlFlowGenericClause *m_pLinkedGenericClause;
  } R700VertexInstruction;
  //
  typedef struct R700VertexSemanticFetch 
  {
  	ShaderInstType          m_ShaderInstType;
  	R700ShaderInstruction * pNextInst;
  	//R700VertexInstruction
  		//R700ShaderInstruction
  	GLuint m_uIndex;
      GLuint useCount;
  		//---------------------
  	
      sq_vtx_word0_u     m_Word0;
      sq_vtx_word1_u     m_Word1;
      sq_vtx_word2_u     m_Word2;
  
      struct R700ControlFlowGenericClause *m_pLinkedGenericClause;
  	//---------------------------
  
      sq_vtx_word1_sem_u m_Word1_SEM;
  } R700VertexSemanticFetch;
  //
  typedef struct R700VertexGenericFetch 
  {
  	ShaderInstType          m_ShaderInstType;
  	R700ShaderInstruction * pNextInst;
  	//R700VertexInstruction
  		//R700ShaderInstruction
  	GLuint m_uIndex;
      GLuint useCount;
  		//---------------------
  	
      sq_vtx_word0_u     m_Word0;
      sq_vtx_word1_u     m_Word1;
      sq_vtx_word2_u     m_Word2;
  
      struct R700ControlFlowGenericClause *m_pLinkedGenericClause;
  	//---------------------------
  
      sq_vtx_word1_gpr_u m_Word1_GPR;
  } R700VertexGenericFetch;
  
  // ------------------- End of Texture Vertex Instruction --------------------
  
  void Init_R700ControlFlowGenericClause(R700ControlFlowGenericClause* pInst);
  void Init_R700ControlFlowALUClause(R700ControlFlowALUClause* pInst);
  void Init_R700ControlFlowSXClause(R700ControlFlowSXClause* pInst);
  void Init_R700ControlFlowSMXClause(R700ControlFlowSMXClause* pInst);
  void Init_R700ALUInstruction(R700ALUInstruction* pInst);
  void Init_R700ALUInstructionHalfLiteral(R700ALUInstructionHalfLiteral* pInst, GLfloat x, GLfloat y);
  void Init_R700ALUInstructionFullLiteral(R700ALUInstructionFullLiteral* pInst, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
  void Init_R700TextureInstruction(R700TextureInstruction* pInst);
  void Init_R700VertexSemanticFetch(R700VertexSemanticFetch* pInst);
  void Init_R700VertexGenericFetch(R700VertexGenericFetch* pInst);
  
  unsigned int GetInstructionSize(ShaderInstType instType);
  unsigned int GetCFMaxInstructions(ShaderInstType instType);
  
  GLboolean LinkVertexInstruction(R700ControlFlowGenericClause *pCFGeneric,
  								R700VertexInstruction *pVTXInstruction);
  
  #endif //_R700_SHADERINST_H_
  