/* * 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 , */ #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_