/*
 * GLSLConversion.h
 *
 * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __GLSLConversion_h_
#define __GLSLConversion_h_ 1

#ifdef __cplusplus
extern "C" {
#endif	//  __cplusplus


#include <stdlib.h>

	
/** This file contains convenience functions for converting GLSL to SPIR-V, callable from standard C code. */


/** Enumeration of the pipeline stages for which a shader can be compiled. */
typedef enum {
	kMVKShaderStageAuto,
	kMVKShaderStageVertex,
	kMVKShaderStageTessControl,
	kMVKShaderStageTessEval,
	kMVKShaderStageGeometry,
	kMVKShaderStageFragment,
	kMVKShaderStageCompute,
} MVKShaderStage;


/**
 * Convenience function that converts the specified GLSL code to SPIR-V code,
 * and returns whether the conversion was successful.
 *
 * If the pSPIRVCode parameter is not NULL, this function allocates space for the
 * converted SPIR-V code, and returns a pointer to that SPIR-V code in the location
 * indicated by this parameter. It is the responsibility of the caller to free() 
 * the memory returned in this parameter.
 *
 * If the pSPIRVLength parameter is not NULL, the length of the SPIR-V code (as 
 * returned in the pSPIRVCode parameter) is returned in the value pointed to by 
 * the pSPIRVLength parameter.
 *
 * If the pResultLog parameter is not NULL, a pointer to the contents of the converter
 * results log will be set at the location pointed to by the pResultLog parameter.
 * It is the responsibility of the caller to free() the memory returned in this parameter.
 *
 * The boolean flags indicate whether the original GLSL code and resulting SPIR-V code
 * should be logged to the converter results log. This can be useful during shader debugging.
 */
bool mvkConvertGLSLToSPIRV(const char* glslSource,
                           MVKShaderStage shaderStage,
                           uint32_t** pSPIRVCode,
                           size_t *pSPIRVLength,
                           char** pResultLog,
                           bool shouldLogGLSL,
                           bool shouldLogSPIRV);
/**
 * Convenience function that converts GLSL code in the specified file to SPIR-V code.
 * The file path should either be absolute or relative to the resource directory.
 *
 * If the pSPIRVCode parameter is not NULL, this function allocates space for the
 * converted SPIR-V code, and returns a pointer to that SPIR-V code in the location
 * indicated by this parameter. It is the responsibility of the caller to free()
 * the memory returned in this parameter.
 *
 * If the pSPIRVLength parameter is not NULL, the length of the SPIR-V code (as
 * returned in the pSPIRVCode parameter) is returned in the value pointed to by
 * the pSPIRVLength parameter.
 *
 * If the pResultLog parameter is not NULL, a pointer to the contents of the converter
 * results log will be set at the location pointed to by the pResultLog parameter.
 * It is the responsibility of the caller to free() the memory returned in this parameter.
 *
 * The boolean flags indicate whether the original GLSL code and resulting SPIR-V code
 * should be logged to the converter results log. This can be useful during shader debugging.
 */
bool mvkConvertGLSLFileToSPIRV(const char* glslFilepath,
                               MVKShaderStage shaderStage,
                               uint32_t** pSPIRVCode,
                               size_t *pSPIRVLength,
                               char** pResultLog,
                               bool shouldLogGLSL,
                               bool shouldLogSPIRV);


#ifdef __cplusplus
}
#endif	//  __cplusplus

#endif
