blob: c6a058617ec070bcb2fb4110e51140535f4ff24e [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_SHADER_H__
#define __R700_SHADER_H__
#include "main/mtypes.h"
#include "r700_shaderinst.h"
void r700ShaderInit(GLcontext * ctx);
typedef enum R700ShaderType
{
R700_SHADER_FS = 0x0,
R700_SHADER_ES = 0x1,
R700_SHADER_GS = 0x2,
R700_SHADER_VS = 0x3,
R700_SHADER_PS = 0x4,
R700_SHADER_INVALID = 0x5,
} R700ShaderType;
typedef struct TypedShaderList
{
R700ShaderInstruction * pHead;
R700ShaderInstruction * pTail;
GLuint uNumOfNode;
} TypedShaderList;
typedef struct RealRegister
{
GLuint uAddr;
GLuint uValue;
} RealRegister;
typedef struct InstDeps
{
GLint nDstDep;
GLint nSrcDeps[3];
} InstDeps;
typedef struct R700_Shader
{
R700ShaderType Type;
GLubyte* pProgram;
GLboolean bBinaryShader;
GLboolean bFetchShaderRequired;
GLboolean bNeedsAssembly;
GLboolean bLinksDirty;
GLuint uShaderBinaryDWORDSize; // in DWORDS
GLuint nRegs;
GLuint nParamExports; // VS_ EXPORT_COUNT (1 based, the actual register is 0 based!)
GLuint nMemExports;
GLuint resource; // VS and PS _RESOURCE
GLuint exportMode; // VS and PS _EXPORT_MODE
GLboolean depthIsImported;
// Vertex program exports
GLboolean positionVectorIsExported;
GLboolean miscVectorIsExported;
GLboolean renderTargetArrayIndexIsExported;
GLboolean ccDist0VectorIsExported;
GLboolean ccDist1VectorIsExported;
// Pixel program exports
GLboolean depthIsExported;
GLboolean stencilRefIsExported;
GLboolean coverageToMaskIsExported;
GLboolean maskIsExported;
GLboolean killIsUsed;
GLuint uStartAddr;
GLuint uCFOffset;
GLuint uEndOfCF;
GLuint uEndOfALU;
GLuint uEndOfFetch;
GLuint uStackSize;
GLuint uMaxCallDepth;
TypedShaderList lstCFInstructions;
TypedShaderList lstALUInstructions;
TypedShaderList lstTEXInstructions;
TypedShaderList lstVTXInstructions;
RealRegister RegStartAddr;
RealRegister RegCFOffset;
RealRegister RegEndCF;
RealRegister RegEndALU;
RealRegister egEndFetcg;
// -------- constants
GLfloat ConstantArray[SQ_ALU_CONSTANT_PS_COUNT * 4];
GLboolean bSurfAllocated;
} R700_Shader;
//Internal
void AddInstToList(TypedShaderList * plstCFInstructions, R700ShaderInstruction * pInst);
void TakeInstOutFromList(TypedShaderList * plstCFInstructions, R700ShaderInstruction * pInst);
void ResolveLinks(R700_Shader *pShader);
void Assemble(R700_Shader *pShader);
//Interface
void Init_R700_Shader(R700_Shader * pShader);
void AddCFInstruction(R700_Shader *pShader, R700ControlFlowInstruction *pCFInst);
void AddVTXInstruction(R700_Shader *pShader, R700VertexInstruction *pVTXInst);
void AddTEXInstruction(R700_Shader *pShader, R700TextureInstruction *pTEXInst);
void AddALUInstruction(R700_Shader *pShader, R700ALUInstruction *pALUInst);
void LoadProgram(R700_Shader *pShader);
void UpdateShaderRegisters(R700_Shader *pShader);
void DeleteInstructions(R700_Shader *pShader);
void DebugPrint(void);
void cleanup_vfetch_shaderinst(R700_Shader *pShader);
void Clean_Up_Shader(R700_Shader *pShader);
#endif /*__R700_SHADER_H__*/