1 /*---------------------------------------------------------------------------*
2 
3   Copyright 2010-2011 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 u32 (*PGSH2GetABIVersion)(void);
70 
71 typedef struct
72 {
73     PGSH2Initialize               Initialize;
74     PGSH2Destroy                  Destroy;
75     PGSH2CompileProgram3          CompileProgram3;
76     PGSH2DestroyGX2Program3       DestroyGX2Program3;
77 
78     PGSH2CalcFetchShaderSizeEx    CalcFetchShaderSizeEx;
79     PGSH2InitFetchShaderEx        InitFetchShaderEx;
80 
81     PGSH2GetVertexShaderGPRs      GetVertexShaderGPRs;
82     PGSH2GetGeometryShaderGPRs    GetGeometryShaderGPRs;
83     PGSH2GetPixelShaderGPRs       GetPixelShaderGPRs;
84 
85     PGSH2GetVertexShaderStackEntries      GetVertexShaderStackEntries;
86     PGSH2GetGeometryShaderStackEntries    GetGeometryShaderStackEntries;
87     PGSH2GetPixelShaderStackEntries       GetPixelShaderStackEntries;
88 
89 	PGSH2GetABIVersion			  GetABIVersion;
90 } GSH2Func;
91 
92 typedef struct
93 {
94     PGFDWriteFileShaderAsCode WriteFileShaderAsCode;
95     PGFDWriteFileShader       WriteFileShader;
96     PGFDAppendWriteFileShader AppendWriteFileShader;
97     PGFDWriteFileShaderAsCode2 WriteFileShaderAsCode2;
98     PGFDWriteFileShader2       WriteFileShader2;
99     PGFDAppendWriteFileShader2 AppendWriteFileShader2;
100     PGFDWriteFileShaderAsCodeWithSource WriteFileShaderAsCodeWithSource;
101 } GFDFunc;
102 
103 // Error codes
104 #define EC_SUCCESS                  0
105 #define EC_UNSUPPORTEDGPU           1
106 #define EC_UNSUPPORTEDSHADERTYPE    2
107 #define EC_INPUTFILEERROR           3
108 #define EC_OUTPUTFILEERROR          4
109 #define EC_BADPARAM                 5
110 #define EC_COMPILEFAILED            6
111 #define EC_GSH2INITFAILED           7
112 #define EC_LOADINGDLLFAILED         8
113 
114 // App config defaults
115 #define DEFAULT_GPU                 GPU_VERSION_GPU7
116 #define DEFAULT_ENDIANBUGFIX        false
117 #define DEFAULT_ALIGNMODE           false
118 #define DEFAULT_APPENDMODE          false
119 #define DEFAULT_OUTFILENAME         "output.gsh"
120 #define DEFAULT_FORCEUNIFORMBLOCK   false
121 #define DEFAULT_ASCODEMODE          false
122 #define DEFAULT_SHADINGLANGUAGE     SHADERLANG_GLSL
123 #define DEFAULT_NOSPARKINFO         false
124 
125 #define MAX_INPUTFILE_COUNT 64
126 
127 // App config
128 typedef struct
129 {
130     char*   vs_source;   // VS shader source code
131     char*   ps_source;   // PS shader source code
132     char*   gs_source;   // GS shader source code
133 
134     char*   vs_source_filename;   // VS shader source code file name
135     char*   ps_source_filename;   // PS shader source code file name
136     char*   gs_source_filename;   // GS shader source code file name
137 
138     char**  so_varyings;   // stream out varyings
139     u32     numSOVaryings; // number of stream out varyings in so_varyings
140 
141     GSH2GPUVersion     gpu;               // Target gpu
142     char*              pOutFilename;      // name of output file
143     GSH2ShaderLang     lang;              // shader language
144     u32                endianbugfix;      // endian bug workaround for the prototype hardware
145     u32                outfilealign;      // add alignment padding to output
146     u32                append;            // append shaders to existing file
147     u32                forceUniformBlock; // force uniform block usage
148     u32                ascode;            // append shaders to existing file
149     u32                dumpShaders;       // dump pre/post optimized file
150 	u64                optimizeFlags;     // what kinds of extra optimization to do (bitmap)
151     u32                noSparkInfo;       // suppress Spark debug output
152 
153     char*              pSparkDir;         // override default output dir for Spark file
154 	char*	cs_source; // compute shader source code
155 	char*	cs_source_filename; // CS shader source code file name
156 
157 	u32					istats;           // if nonzero, dump shader instruction statistics
158 	u32					noArrayLimit;     // if nonzero, do not limit number of symbols produced by uniform arrays
159 } ShaderSourceInfo;
160 
161 #ifdef __cplusplus
162 }
163 #endif // __cplusplus
164 
165 #endif  // __GSH_COMPILE_H__
166 
167