1 /*---------------------------------------------------------------------------*
2 
3   Copyright (C) Nintendo.  All rights reserved.
4 
5   These coded instructions, statements, and computer programs contain
6   proprietary information of Nintendo of America Inc. and/or Nintendo
7   Company Ltd., and are protected by Federal copyright law.  They may
8   not be disclosed to third parties or copied or duplicated in any form,
9   in whole or in part, without the prior written consent of Nintendo.
10 
11  *---------------------------------------------------------------------------*/
12 
13 #pragma once
14 #ifndef __GSH_COMPILE_H__
15 #define __GSH_COMPILE_H__
16 
17 #ifdef __cplusplus
18 extern "C"
19 {
20 #endif // __cplusplus
21 
22 #include "shaderUtils.h"
23 #include "windows/gx2.h"
24 #include "cafe/gfd.h"
25 #include "gfdFile.h"
26 
27 #ifdef _DEBUG
28 #define _CRTDBG_MAP_ALLOC
29 #include <stdlib.h>
30 #include <crtdbg.h>
31 #endif
32 
33 // Input DLLs
34 #ifdef _DEBUG
35 #define LIB_DLL_SHADERUTILS TEXT("shaderUtilsD.dll")
36 #define LIB_DLL_GFD         TEXT("gfdD.dll")
37 #else
38 #define LIB_DLL_SHADERUTILS TEXT("shaderUtils.dll")
39 #define LIB_DLL_GFD         TEXT("gfd.dll")
40 #endif
41 
42 // Functions
43 typedef GSH2Handle   (*PGSH2Initialize)(GSH2Setup * pSetup);
44 typedef GX2Boolean (*PGSH2Destroy)(GSH2Handle h);
45 typedef GX2Boolean (*PGSH2CompileProgram)(GSH2Handle h, GSH2CompileSetup *pSetup, GSH2CompileOutput* pOutput);
46 typedef GX2Boolean (*PGSH2CompileProgram3)(GSH2Handle h, GSH2CompileSetup3 *pSetup, GSH2CompileOutput3* pOutput);
47 typedef GX2Boolean (*PGSH2DestroyGX2Program3)(GSH2Handle h, GSH2GX2Program3* pGx2Program);
48 
49 typedef u32  (*PGSH2CalcFetchShaderSizeEx)(u32 num_attrib, GX2FetchShaderType fsType, GX2TessellationMode tessMode);
50 typedef void (*PGSH2InitFetchShaderEx)(GX2FetchShader* fs, void* fs_buffer, u32 num, const GX2AttribStream* attribs, GX2FetchShaderType type, GX2TessellationMode tessMode);
51 
52 typedef u32 (*PGSH2GetVertexShaderGPRs)(const GX2VertexShader * pShader);
53 typedef u32 (*PGSH2GetGeometryShaderGPRs)(const GX2GeometryShader * pShader);
54 typedef u32 (*PGSH2GetPixelShaderGPRs)(const GX2PixelShader * pShader);
55 
56 typedef u32 (*PGSH2GetVertexShaderStackEntries)(const GX2VertexShader * pShader);
57 typedef u32 (*PGSH2GetGeometryShaderStackEntries)(const GX2GeometryShader * pShader);
58 typedef u32 (*PGSH2GetPixelShaderStackEntries)(const GX2PixelShader * pShader);
59 
60 typedef GX2Boolean (*PGFDWriteFileShader)(char* pFilename, GFDGPUVersion gpuVer, GFDEndianSwapMode swapMode, GFDAlignMode alignMode, u32 numShader, GFDShaders *pShaders);
61 typedef GX2Boolean (*PGFDAppendWriteFileShader)(char* pFilename, GFDGPUVersion gpuVer, GFDEndianSwapMode swapMode, GFDAlignMode alignMode, u32 numShader, GFDShaders *pShaders);
62 typedef GX2Boolean (*PGFDWriteFileShaderAsCode)(char* pFilename, GFDEndianSwapMode swapMode, GFDShaders *pShaders);
63 
64 typedef GX2Boolean (*PGFDWriteFileShader2)(char* pFilename, GFDGPUVersion gpuVer, GFDEndianSwapMode swapMode, GFDAlignMode alignMode, u32 numShader, GFDShaders2 *pShaders);
65 typedef GX2Boolean (*PGFDAppendWriteFileShader2)(char* pFilename, GFDGPUVersion gpuVer, GFDEndianSwapMode swapMode, GFDAlignMode alignMode, u32 numShader, GFDShaders2 *pShaders);
66 typedef GX2Boolean (*PGFDWriteFileShaderAsCode2)(char* pFilename, GFDEndianSwapMode swapMode, GFDShaders2 *pShaders);
67 typedef GX2Boolean (*PGFDWriteFileShaderAsCodeWithSource)(char* pFilename, GFDEndianSwapMode swapMode, const GFDShaders2 *pShaders, const GFDShadersSrc *pShadersSrc);
68 
69 typedef GX2Boolean (*PGSH2PrintBuildTimeStats)(const char *pFilename, GSH2BuildTimeStats *pStats, GX2Boolean bAppend);
70 
71 typedef u32 (*PGSH2GetABIVersion)(void);
72 
73 typedef struct
74 {
75     PGSH2Initialize               Initialize;
76     PGSH2Destroy                  Destroy;
77     PGSH2CompileProgram3          CompileProgram3;
78     PGSH2DestroyGX2Program3       DestroyGX2Program3;
79 
80     PGSH2CalcFetchShaderSizeEx    CalcFetchShaderSizeEx;
81     PGSH2InitFetchShaderEx        InitFetchShaderEx;
82 
83     PGSH2GetVertexShaderGPRs      GetVertexShaderGPRs;
84     PGSH2GetGeometryShaderGPRs    GetGeometryShaderGPRs;
85     PGSH2GetPixelShaderGPRs       GetPixelShaderGPRs;
86 
87     PGSH2GetVertexShaderStackEntries      GetVertexShaderStackEntries;
88     PGSH2GetGeometryShaderStackEntries    GetGeometryShaderStackEntries;
89     PGSH2GetPixelShaderStackEntries       GetPixelShaderStackEntries;
90 
91 	PGSH2GetABIVersion			  GetABIVersion;
92 	PGSH2PrintBuildTimeStats      PrintBuildTimeStats;
93 
94 } GSH2Func;
95 
96 typedef struct
97 {
98     PGFDWriteFileShaderAsCode WriteFileShaderAsCode;
99     PGFDWriteFileShader       WriteFileShader;
100     PGFDAppendWriteFileShader AppendWriteFileShader;
101     PGFDWriteFileShaderAsCode2 WriteFileShaderAsCode2;
102     PGFDWriteFileShader2       WriteFileShader2;
103     PGFDAppendWriteFileShader2 AppendWriteFileShader2;
104     PGFDWriteFileShaderAsCodeWithSource WriteFileShaderAsCodeWithSource;
105 } GFDFunc;
106 
107 // Error codes
108 #define EC_SUCCESS                  0
109 #define EC_UNSUPPORTEDGPU           1
110 #define EC_UNSUPPORTEDSHADERTYPE    2
111 #define EC_INPUTFILEERROR           3
112 #define EC_OUTPUTFILEERROR          4
113 #define EC_BADPARAM                 5
114 #define EC_COMPILEFAILED            6
115 #define EC_GSH2INITFAILED           7
116 #define EC_LOADINGDLLFAILED         8
117 
118 // App config defaults
119 #define DEFAULT_GPU                 GPU_VERSION_GPU7
120 #define DEFAULT_ENDIANBUGFIX        false
121 #define DEFAULT_ALIGNMODE           false
122 #define DEFAULT_APPENDMODE          false
123 #define DEFAULT_OUTFILENAME         "output.gsh"
124 #define DEFAULT_FORCEUNIFORMBLOCK   false
125 #define DEFAULT_ASCODEMODE          false
126 #define DEFAULT_SHADINGLANGUAGE     SHADERLANG_GLSL
127 #define DEFAULT_NOSPARKINFO         false
128 
129 #define MAX_INPUTFILE_COUNT 64
130 
131 // App config
132 typedef struct
133 {
134     char*   vs_source;   // VS shader source code
135     char*   ps_source;   // PS shader source code
136     char*   gs_source;   // GS shader source code
137 
138     char*   vs_source_filename;   // VS shader source code file name
139     char*   ps_source_filename;   // PS shader source code file name
140     char*   gs_source_filename;   // GS shader source code file name
141 
142     char**  so_varyings;   // stream out varyings
143     u32     numSOVaryings; // number of stream out varyings in so_varyings
144 
145     GSH2GPUVersion     gpu;               // Target gpu
146     char*              pOutFilename;      // name of output file
147     GSH2ShaderLang     lang;              // shader language
148     u32                endianbugfix;      // endian bug workaround for the prototype hardware
149     u32                outfilealign;      // add alignment padding to output
150     u32                append;            // append shaders to existing file
151     u32                forceUniformBlock; // force uniform block usage
152     u32                ascode;            // append shaders to existing file
153     u32                dumpShaders;       // dump pre/post optimized file
154 	u64                optimizeFlags;     // what kinds of extra optimization to do (bitmap)
155     u32                noSparkInfo;       // suppress Spark debug output
156 
157     char*              pSparkDir;         // override default output dir for Spark file
158 	char*	cs_source; // compute shader source code
159 	char*	cs_source_filename; // CS shader source code file name
160 
161 	u32					istats;           // if nonzero, dump shader instruction statistics
162 	u32					noArrayLimit;     // if nonzero, do not limit number of symbols produced by uniform arrays
163 	u32					btstats;		  // 1 = output build time statistics, 2 = accumulate statistics
164 } ShaderSourceInfo;
165 
166 #ifdef __cplusplus
167 }
168 #endif // __cplusplus
169 
170 #endif  // __GSH_COMPILE_H__
171 
172