1 // 2 // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 #ifndef _COMPILER_INTERFACE_INCLUDED_ 7 #define _COMPILER_INTERFACE_INCLUDED_ 8 9 // 10 // This is the platform independent interface between an OGL driver 11 // and the shading language compiler. 12 // 13 14 #ifdef __cplusplus 15 extern "C" { 16 #endif 17 18 // Version number for shader translation API. 19 // It is incremented everytime the API changes. 20 #define SH_VERSION 103 21 22 // 23 // The names of the following enums have been derived by replacing GL prefix 24 // with SH. For example, SH_INFO_LOG_LENGTH is equivalent to GL_INFO_LOG_LENGTH. 25 // The enum values are also equal to the values of their GL counterpart. This 26 // is done to make it easier for applications to use the shader library. 27 // 28 typedef enum { 29 SH_FRAGMENT_SHADER = 0x8B30, 30 SH_VERTEX_SHADER = 0x8B31 31 } ShShaderType; 32 33 typedef enum { 34 SH_GLES2_SPEC = 0x8B40, 35 SH_WEBGL_SPEC = 0x8B41 36 } ShShaderSpec; 37 38 typedef enum { 39 SH_NONE = 0, 40 SH_INT = 0x1404, 41 SH_FLOAT = 0x1406, 42 SH_FLOAT_VEC2 = 0x8B50, 43 SH_FLOAT_VEC3 = 0x8B51, 44 SH_FLOAT_VEC4 = 0x8B52, 45 SH_INT_VEC2 = 0x8B53, 46 SH_INT_VEC3 = 0x8B54, 47 SH_INT_VEC4 = 0x8B55, 48 SH_BOOL = 0x8B56, 49 SH_BOOL_VEC2 = 0x8B57, 50 SH_BOOL_VEC3 = 0x8B58, 51 SH_BOOL_VEC4 = 0x8B59, 52 SH_FLOAT_MAT2 = 0x8B5A, 53 SH_FLOAT_MAT3 = 0x8B5B, 54 SH_FLOAT_MAT4 = 0x8B5C, 55 SH_SAMPLER_2D = 0x8B5E, 56 SH_SAMPLER_CUBE = 0x8B60 57 } ShDataType; 58 59 typedef enum { 60 SH_INFO_LOG_LENGTH = 0x8B84, 61 SH_OBJECT_CODE_LENGTH = 0x8B88, // GL_SHADER_SOURCE_LENGTH 62 SH_ACTIVE_UNIFORMS = 0x8B86, 63 SH_ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87, 64 SH_ACTIVE_ATTRIBUTES = 0x8B89, 65 SH_ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A 66 } ShShaderInfo; 67 68 // Compile options. 69 typedef enum { 70 SH_VALIDATE = 0, 71 SH_VALIDATE_LOOP_INDEXING = 0x0001, 72 SH_INTERMEDIATE_TREE = 0x0002, 73 SH_OBJECT_CODE = 0x0004, 74 SH_ATTRIBUTES_UNIFORMS = 0x0008 75 } ShCompileOptions; 76 77 // 78 // Driver must call this first, once, before doing any other 79 // compiler operations. 80 // If the function succeeds, the return value is nonzero, else zero. 81 // 82 int ShInitialize(); 83 // 84 // Driver should call this at shutdown. 85 // If the function succeeds, the return value is nonzero, else zero. 86 // 87 int ShFinalize(); 88 89 // 90 // Implementation dependent built-in resources (constants and extensions). 91 // The names for these resources has been obtained by stripping gl_/GL_. 92 // 93 typedef struct 94 { 95 // Constants. 96 int MaxVertexAttribs; 97 int MaxVertexUniformVectors; 98 int MaxVaryingVectors; 99 int MaxVertexTextureImageUnits; 100 int MaxCombinedTextureImageUnits; 101 int MaxTextureImageUnits; 102 int MaxFragmentUniformVectors; 103 int MaxDrawBuffers; 104 105 // Extensions. 106 // Set to 1 to enable the extension, else 0. 107 int OES_standard_derivatives; 108 } ShBuiltInResources; 109 110 // 111 // Initialize built-in resources with minimum expected values. 112 // 113 void ShInitBuiltInResources(ShBuiltInResources* resources); 114 115 // 116 // ShHandle held by but opaque to the driver. It is allocated, 117 // managed, and de-allocated by the compiler. It's contents 118 // are defined by and used by the compiler. 119 // 120 // If handle creation fails, 0 will be returned. 121 // 122 typedef void* ShHandle; 123 124 // 125 // Driver calls these to create and destroy compiler objects. 126 // 127 // Returns the handle of constructed compiler. 128 // Parameters: 129 // type: Specifies the type of shader - SH_FRAGMENT_SHADER or SH_VERTEX_SHADER. 130 // spec: Specifies the language spec the compiler must conform to - 131 // SH_GLES2_SPEC or SH_WEBGL_SPEC. 132 // resources: Specifies the built-in resources. 133 ShHandle ShConstructCompiler(ShShaderType type, ShShaderSpec spec, 134 const ShBuiltInResources* resources); 135 void ShDestruct(ShHandle handle); 136 137 // 138 // Compiles the given shader source. 139 // If the function succeeds, the return value is nonzero, else zero. 140 // Parameters: 141 // handle: Specifies the handle of compiler to be used. 142 // shaderStrings: Specifies an array of pointers to null-terminated strings 143 // containing the shader source code. 144 // numStrings: Specifies the number of elements in shaderStrings array. 145 // compileOptions: A mask containing the following parameters: 146 // SH_VALIDATE: Validates shader to ensure that it conforms to the spec 147 // specified during compiler construction. 148 // SH_VALIDATE_LOOP_INDEXING: Validates loop and indexing in the shader to 149 // ensure that they do not exceed the minimum 150 // functionality mandated in GLSL 1.0 spec, 151 // Appendix A, Section 4 and 5. 152 // There is no need to specify this parameter when 153 // compiling for WebGL - it is implied. 154 // SH_INTERMEDIATE_TREE: Writes intermediate tree to info log. 155 // Can be queried by calling ShGetInfoLog(). 156 // SH_OBJECT_CODE: Translates intermediate tree to glsl or hlsl shader. 157 // Can be queried by calling ShGetObjectCode(). 158 // SH_ATTRIBUTES_UNIFORMS: Extracts attributes and uniforms. 159 // Can be queried by calling ShGetActiveAttrib() and 160 // ShGetActiveUniform(). 161 // 162 int ShCompile( 163 const ShHandle handle, 164 const char* const shaderStrings[], 165 const int numStrings, 166 int compileOptions 167 ); 168 169 // Returns a parameter from a compiled shader. 170 // Parameters: 171 // handle: Specifies the compiler 172 // pname: Specifies the parameter to query. 173 // The following parameters are defined: 174 // SH_INFO_LOG_LENGTH: the number of characters in the information log 175 // including the null termination character. 176 // SH_OBJECT_CODE_LENGTH: the number of characters in the object code 177 // including the null termination character. 178 // SH_ACTIVE_ATTRIBUTES: the number of active attribute variables. 179 // SH_ACTIVE_ATTRIBUTE_MAX_LENGTH: the length of the longest active attribute 180 // variable name including the null 181 // termination character. 182 // SH_ACTIVE_UNIFORMS: the number of active uniform variables. 183 // SH_ACTIVE_UNIFORM_MAX_LENGTH: the length of the longest active uniform 184 // variable name including the null 185 // termination character. 186 // 187 // params: Requested parameter 188 void ShGetInfo(const ShHandle handle, ShShaderInfo pname, int* params); 189 190 // Returns nul-terminated information log for a compiled shader. 191 // Parameters: 192 // handle: Specifies the compiler 193 // infoLog: Specifies an array of characters that is used to return 194 // the information log. It is assumed that infoLog has enough memory 195 // to accomodate the information log. The size of the buffer required 196 // to store the returned information log can be obtained by calling 197 // ShGetInfo with SH_INFO_LOG_LENGTH. 198 void ShGetInfoLog(const ShHandle handle, char* infoLog); 199 200 // Returns null-terminated object code for a compiled shader. 201 // Parameters: 202 // handle: Specifies the compiler 203 // infoLog: Specifies an array of characters that is used to return 204 // the object code. It is assumed that infoLog has enough memory to 205 // accomodate the object code. The size of the buffer required to 206 // store the returned object code can be obtained by calling 207 // ShGetInfo with SH_OBJECT_CODE_LENGTH. 208 void ShGetObjectCode(const ShHandle handle, char* objCode); 209 210 // Returns information about an active attribute variable. 211 // Parameters: 212 // handle: Specifies the compiler 213 // index: Specifies the index of the attribute variable to be queried. 214 // length: Returns the number of characters actually written in the string 215 // indicated by name (excluding the null terminator) if a value other 216 // than NULL is passed. 217 // size: Returns the size of the attribute variable. 218 // type: Returns the data type of the attribute variable. 219 // name: Returns a null terminated string containing the name of the 220 // attribute variable. It is assumed that name has enough memory to 221 // accomodate the attribute variable name. The size of the buffer 222 // required to store the attribute variable name can be obtained by 223 // calling ShGetInfo with SH_ACTIVE_ATTRIBUTE_MAX_LENGTH. 224 void ShGetActiveAttrib(const ShHandle handle, 225 int index, 226 int* length, 227 int* size, 228 ShDataType* type, 229 char* name); 230 231 // Returns information about an active uniform variable. 232 // Parameters: 233 // handle: Specifies the compiler 234 // index: Specifies the index of the uniform variable to be queried. 235 // length: Returns the number of characters actually written in the string 236 // indicated by name (excluding the null terminator) if a value 237 // other than NULL is passed. 238 // size: Returns the size of the uniform variable. 239 // type: Returns the data type of the uniform variable. 240 // name: Returns a null terminated string containing the name of the 241 // uniform variable. It is assumed that name has enough memory to 242 // accomodate the uniform variable name. The size of the buffer required 243 // to store the uniform variable name can be obtained by calling 244 // ShGetInfo with SH_ACTIVE_UNIFORMS_MAX_LENGTH. 245 void ShGetActiveUniform(const ShHandle handle, 246 int index, 247 int* length, 248 int* size, 249 ShDataType* type, 250 char* name); 251 252 #ifdef __cplusplus 253 } 254 #endif 255 256 #endif // _COMPILER_INTERFACE_INCLUDED_ 257