blob: cdb9a570f7ccf036442b979fee927eeff5631a06 [file] [log] [blame]
/*
* 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_