223 lines
5.7 KiB
C
223 lines
5.7 KiB
C
|
// Copyright (c) The HLSL2GLSLFork Project Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
// found in the LICENSE.txt file.
|
||
|
|
||
|
#ifndef _HLSL2GLSL_INTERFACE_INCLUDED_
|
||
|
#define _HLSL2GLSL_INTERFACE_INCLUDED_
|
||
|
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
#define C_DECL __cdecl
|
||
|
#define SH_IMPORT_EXPORT
|
||
|
#else
|
||
|
#define SH_IMPORT_EXPORT
|
||
|
#define __fastcall
|
||
|
#define C_DECL
|
||
|
#endif
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/// Types of languages the HLSL2GLSL translator can consume.
|
||
|
typedef enum
|
||
|
{
|
||
|
EShLangVertex,
|
||
|
EShLangFragment,
|
||
|
EShLangCount,
|
||
|
} EShLanguage;
|
||
|
|
||
|
/// Binding table. This can be used for locating attributes, uniforms, globals, etc., as needed.
|
||
|
typedef struct
|
||
|
{
|
||
|
char* name;
|
||
|
int binding;
|
||
|
} ShBinding;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
int numBindings;
|
||
|
ShBinding* bindings; // array of bindings
|
||
|
} ShBindingTable;
|
||
|
|
||
|
|
||
|
/// GLSL shader variable types
|
||
|
/// NOTE: these are ordered to exactly match the internal enums
|
||
|
typedef enum
|
||
|
{
|
||
|
EShTypeVoid,
|
||
|
EShTypeBool,
|
||
|
EShTypeBVec2,
|
||
|
EShTypeBVec3,
|
||
|
EShTypeBVec4,
|
||
|
EShTypeInt,
|
||
|
EShTypeIVec2,
|
||
|
EShTypeIVec3,
|
||
|
EShTypeIVec4,
|
||
|
EShTypeFloat,
|
||
|
EShTypeVec2,
|
||
|
EShTypeVec3,
|
||
|
EShTypeVec4,
|
||
|
EShTypeMat2,
|
||
|
EShTypeMat3,
|
||
|
EShTypeMat4,
|
||
|
EShTypeSampler,
|
||
|
EShTypeSampler1D,
|
||
|
EShTypeSampler2D,
|
||
|
EShTypeSampler3D,
|
||
|
EShTypeSamplerCube,
|
||
|
EShTypeStruct
|
||
|
} EShType;
|
||
|
|
||
|
|
||
|
/// HLSL attribute semantics
|
||
|
/// NOTE: these are ordered to exactly match the internal tables
|
||
|
enum EAttribSemantic
|
||
|
{
|
||
|
EAttrSemNone,
|
||
|
EAttrSemPosition,
|
||
|
EAttrSemVPos,
|
||
|
EAttrSemVFace,
|
||
|
EAttrSemNormal,
|
||
|
EAttrSemColor0,
|
||
|
EAttrSemColor1,
|
||
|
EAttrSemColor2,
|
||
|
EAttrSemColor3,
|
||
|
EAttrSemTex0,
|
||
|
EAttrSemTex1,
|
||
|
EAttrSemTex2,
|
||
|
EAttrSemTex3,
|
||
|
EAttrSemTex4,
|
||
|
EAttrSemTex5,
|
||
|
EAttrSemTex6,
|
||
|
EAttrSemTex7,
|
||
|
EAttrSemTex8,
|
||
|
EAttrSemTex9,
|
||
|
EAttrSemTangent,
|
||
|
EAttrSemBinormal,
|
||
|
EAttrSemBlendWeight,
|
||
|
EAttrSemBlendIndices,
|
||
|
EAttrSemDepth,
|
||
|
EAttrSemSize,
|
||
|
EAttrSemUnknown,
|
||
|
EAttrSemCount
|
||
|
};
|
||
|
|
||
|
|
||
|
/// Uniform info struct
|
||
|
typedef struct
|
||
|
{
|
||
|
char *name;
|
||
|
char *semantic;
|
||
|
EShType type;
|
||
|
int arraySize;
|
||
|
float *init;
|
||
|
void *annt;
|
||
|
} ShUniformInfo;
|
||
|
|
||
|
|
||
|
/// Translation options
|
||
|
enum TTranslateOptions
|
||
|
{
|
||
|
ETranslateOpNone = 0,
|
||
|
ETranslateOpIntermediate = (1<<0),
|
||
|
ETranslateOpUsePrecision = (1<<1),
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
/// Generic opaque handle. This type is used for handles to the parser/translator.
|
||
|
/// If handle creation fails, 0 will be returned.
|
||
|
class HlslCrossCompiler;
|
||
|
typedef HlslCrossCompiler* ShHandle;
|
||
|
|
||
|
|
||
|
/// Initialize the HLSL2GLSL translator. This function must be called once prior to calling any other
|
||
|
/// HLSL2GLSL translator functions
|
||
|
/// \return
|
||
|
/// 1 on success, 0 on failure
|
||
|
SH_IMPORT_EXPORT int C_DECL Hlsl2Glsl_Initialize();
|
||
|
|
||
|
|
||
|
/// Finalize the HLSL2GLSL translator. This function should be called to de-initialize the HLSL2GLSL
|
||
|
/// translator and should only be called once on shutdown.
|
||
|
/// \return
|
||
|
/// 1 on success, 0 on failure
|
||
|
SH_IMPORT_EXPORT int C_DECL Hlsl2Glsl_Finalize();
|
||
|
|
||
|
|
||
|
/// Construct a compiler for the given language (one per shader)
|
||
|
SH_IMPORT_EXPORT ShHandle C_DECL Hlsl2Glsl_ConstructCompiler( const EShLanguage language );
|
||
|
|
||
|
|
||
|
SH_IMPORT_EXPORT void C_DECL Hlsl2Glsl_DestructCompiler( ShHandle handle );
|
||
|
|
||
|
|
||
|
|
||
|
/// Parse HLSL shader to prepare it for final translation.
|
||
|
SH_IMPORT_EXPORT int C_DECL Hlsl2Glsl_Parse( const ShHandle handle,
|
||
|
const char* shaderString,
|
||
|
int option );
|
||
|
|
||
|
|
||
|
|
||
|
/// After parsing a HLSL shader, do the final translation to GLSL.
|
||
|
SH_IMPORT_EXPORT int C_DECL Hlsl2Glsl_Translate( const ShHandle handle, const char* entry, int options );
|
||
|
|
||
|
|
||
|
/// After translating HLSL shader(s), retrieve the translated GLSL source.
|
||
|
SH_IMPORT_EXPORT const char* C_DECL Hlsl2Glsl_GetShader( const ShHandle handle );
|
||
|
|
||
|
|
||
|
SH_IMPORT_EXPORT const char* C_DECL Hlsl2Glsl_GetInfoLog( const ShHandle handle );
|
||
|
|
||
|
|
||
|
/// After translating, retrieve the number of uniforms
|
||
|
SH_IMPORT_EXPORT int C_DECL Hlsl2Glsl_GetUniformCount( const ShHandle handle );
|
||
|
|
||
|
|
||
|
/// After translating, retrieve the uniform info table
|
||
|
SH_IMPORT_EXPORT const ShUniformInfo* C_DECL Hlsl2Glsl_GetUniformInfo( const ShHandle handle );
|
||
|
|
||
|
|
||
|
/// Instead of mapping HLSL attributes to GLSL fixed-function attributes, this function can be used to
|
||
|
/// override the attribute mapping. This tells the code generator to use user-defined attributes for
|
||
|
/// the semantics that are specified.
|
||
|
///
|
||
|
/// \param handle
|
||
|
/// Handle to the compiler. This should be called BEFORE calling Hlsl2Glsl_Translate
|
||
|
/// \param pSemanticEnums
|
||
|
/// Array of semantic enums to set
|
||
|
/// \param pSemanticNames
|
||
|
/// Array of user attribute names to use
|
||
|
/// \param nNumSemantics
|
||
|
/// Number of semantics to set in the arrays
|
||
|
/// \return
|
||
|
/// 1 on success, 0 on failure
|
||
|
SH_IMPORT_EXPORT int C_DECL Hlsl2Glsl_SetUserAttributeNames ( ShHandle handle,
|
||
|
const EAttribSemantic *pSemanticEnums,
|
||
|
const char *pSemanticNames[],
|
||
|
int nNumSemantics );
|
||
|
|
||
|
|
||
|
/// Instead of using OpenGL fixed-function varyings (such as gl_TexCoord[x]), use user named varyings
|
||
|
/// instead.
|
||
|
///
|
||
|
/// \param handle
|
||
|
/// Handle to the compiler. This should be called BEFORE calling Hlsl2Glsl_Translate
|
||
|
/// \param bUseUserVarying
|
||
|
/// If true, all user varyings will be used. If false, the translator will attempt to use
|
||
|
/// GL fixed-function varyings
|
||
|
/// \return
|
||
|
/// 1 on success, 0 on failure
|
||
|
SH_IMPORT_EXPORT int C_DECL Hlsl2Glsl_UseUserVaryings ( ShHandle handle,
|
||
|
bool bUseUserVaryings );
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif // _HLSL2GLSL_INTERFACE_INCLUDED_
|