Home | History | Annotate | Download | only in GLSLANG
      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