/*---------------------------------------------------------------------------* Copyright 2010-2011 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. *---------------------------------------------------------------------------*/ #pragma once #ifndef __GSH_COMPILE_H__ #define __GSH_COMPILE_H__ #ifdef __cplusplus extern "C" { #endif // __cplusplus #include "shaderUtils.h" #include "windows/gx2.h" #include "cafe/gfd.h" #include "gfdFile.h" #ifdef _DEBUG #define _CRTDBG_MAP_ALLOC #include #include #endif // Input DLLs #ifdef _DEBUG #define LIB_DLL_SHADERUTILS TEXT("shaderUtilsD.dll") #define LIB_DLL_GFD TEXT("gfdD.dll") #else #define LIB_DLL_SHADERUTILS TEXT("shaderUtils.dll") #define LIB_DLL_GFD TEXT("gfd.dll") #endif // Functions typedef GSH2Handle (*PGSH2Initialize)(GSH2Setup * pSetup); typedef GX2Boolean (*PGSH2Destroy)(GSH2Handle h); typedef GX2Boolean (*PGSH2CompileProgram)(GSH2Handle h, GSH2CompileSetup *pSetup, GSH2CompileOutput* pOutput); typedef GX2Boolean (*PGSH2CompileProgram3)(GSH2Handle h, GSH2CompileSetup3 *pSetup, GSH2CompileOutput3* pOutput); typedef GX2Boolean (*PGSH2DestroyGX2Program3)(GSH2Handle h, GSH2GX2Program3* pGx2Program); typedef u32 (*PGSH2CalcFetchShaderSizeEx)(u32 num_attrib, GX2FetchShaderType fsType, GX2TessellationMode tessMode); typedef void (*PGSH2InitFetchShaderEx)(GX2FetchShader* fs, void* fs_buffer, u32 num, const GX2AttribStream* attribs, GX2FetchShaderType type, GX2TessellationMode tessMode); typedef u32 (*PGSH2GetVertexShaderGPRs)(const GX2VertexShader * pShader); typedef u32 (*PGSH2GetGeometryShaderGPRs)(const GX2GeometryShader * pShader); typedef u32 (*PGSH2GetPixelShaderGPRs)(const GX2PixelShader * pShader); typedef u32 (*PGSH2GetVertexShaderStackEntries)(const GX2VertexShader * pShader); typedef u32 (*PGSH2GetGeometryShaderStackEntries)(const GX2GeometryShader * pShader); typedef u32 (*PGSH2GetPixelShaderStackEntries)(const GX2PixelShader * pShader); typedef GX2Boolean (*PGFDWriteFileShader)(char* pFilename, GFDGPUVersion gpuVer, GFDEndianSwapMode swapMode, GFDAlignMode alignMode, u32 numShader, GFDShaders *pShaders); typedef GX2Boolean (*PGFDAppendWriteFileShader)(char* pFilename, GFDGPUVersion gpuVer, GFDEndianSwapMode swapMode, GFDAlignMode alignMode, u32 numShader, GFDShaders *pShaders); typedef GX2Boolean (*PGFDWriteFileShaderAsCode)(char* pFilename, GFDEndianSwapMode swapMode, GFDShaders *pShaders); typedef GX2Boolean (*PGFDWriteFileShader2)(char* pFilename, GFDGPUVersion gpuVer, GFDEndianSwapMode swapMode, GFDAlignMode alignMode, u32 numShader, GFDShaders2 *pShaders); typedef GX2Boolean (*PGFDAppendWriteFileShader2)(char* pFilename, GFDGPUVersion gpuVer, GFDEndianSwapMode swapMode, GFDAlignMode alignMode, u32 numShader, GFDShaders2 *pShaders); typedef GX2Boolean (*PGFDWriteFileShaderAsCode2)(char* pFilename, GFDEndianSwapMode swapMode, GFDShaders2 *pShaders); typedef GX2Boolean (*PGFDWriteFileShaderAsCodeWithSource)(char* pFilename, GFDEndianSwapMode swapMode, const GFDShaders2 *pShaders, const GFDShadersSrc *pShadersSrc); typedef u32 (*PGSH2GetABIVersion)(void); typedef struct { PGSH2Initialize Initialize; PGSH2Destroy Destroy; PGSH2CompileProgram3 CompileProgram3; PGSH2DestroyGX2Program3 DestroyGX2Program3; PGSH2CalcFetchShaderSizeEx CalcFetchShaderSizeEx; PGSH2InitFetchShaderEx InitFetchShaderEx; PGSH2GetVertexShaderGPRs GetVertexShaderGPRs; PGSH2GetGeometryShaderGPRs GetGeometryShaderGPRs; PGSH2GetPixelShaderGPRs GetPixelShaderGPRs; PGSH2GetVertexShaderStackEntries GetVertexShaderStackEntries; PGSH2GetGeometryShaderStackEntries GetGeometryShaderStackEntries; PGSH2GetPixelShaderStackEntries GetPixelShaderStackEntries; PGSH2GetABIVersion GetABIVersion; } GSH2Func; typedef struct { PGFDWriteFileShaderAsCode WriteFileShaderAsCode; PGFDWriteFileShader WriteFileShader; PGFDAppendWriteFileShader AppendWriteFileShader; PGFDWriteFileShaderAsCode2 WriteFileShaderAsCode2; PGFDWriteFileShader2 WriteFileShader2; PGFDAppendWriteFileShader2 AppendWriteFileShader2; PGFDWriteFileShaderAsCodeWithSource WriteFileShaderAsCodeWithSource; } GFDFunc; // Error codes #define EC_SUCCESS 0 #define EC_UNSUPPORTEDGPU 1 #define EC_UNSUPPORTEDSHADERTYPE 2 #define EC_INPUTFILEERROR 3 #define EC_OUTPUTFILEERROR 4 #define EC_BADPARAM 5 #define EC_COMPILEFAILED 6 #define EC_GSH2INITFAILED 7 #define EC_LOADINGDLLFAILED 8 // App config defaults #define DEFAULT_GPU GPU_VERSION_GPU7 #define DEFAULT_ENDIANBUGFIX false #define DEFAULT_ALIGNMODE false #define DEFAULT_APPENDMODE false #define DEFAULT_OUTFILENAME "output.gsh" #define DEFAULT_FORCEUNIFORMBLOCK false #define DEFAULT_ASCODEMODE false #define DEFAULT_SHADINGLANGUAGE SHADERLANG_GLSL #define DEFAULT_NOSPARKINFO false #define MAX_INPUTFILE_COUNT 64 // App config typedef struct { char* vs_source; // VS shader source code char* ps_source; // PS shader source code char* gs_source; // GS shader source code char* vs_source_filename; // VS shader source code file name char* ps_source_filename; // PS shader source code file name char* gs_source_filename; // GS shader source code file name char** so_varyings; // stream out varyings u32 numSOVaryings; // number of stream out varyings in so_varyings GSH2GPUVersion gpu; // Target gpu char* pOutFilename; // name of output file GSH2ShaderLang lang; // shader language u32 endianbugfix; // endian bug workaround for the prototype hardware u32 outfilealign; // add alignment padding to output u32 append; // append shaders to existing file u32 forceUniformBlock; // force uniform block usage u32 ascode; // append shaders to existing file u32 dumpShaders; // dump pre/post optimized file u64 optimizeFlags; // what kinds of extra optimization to do (bitmap) u32 noSparkInfo; // suppress Spark debug output char* pSparkDir; // override default output dir for Spark file char* cs_source; // compute shader source code char* cs_source_filename; // CS shader source code file name u32 istats; // if nonzero, dump shader instruction statistics u32 noArrayLimit; // if nonzero, do not limit number of symbols produced by uniform arrays } ShaderSourceInfo; #ifdef __cplusplus } #endif // __cplusplus #endif // __GSH_COMPILE_H__