#pragma once #ifndef GLSL_OPTIMIZER_H #define GLSL_OPTIMIZER_H /* Main GLSL optimizer interface. See ../../README.md for more instructions. General usage: ctx = glslopt_initialize(); for (lots of shaders) { shader = glslopt_optimize (ctx, shaderType, shaderSource, options); if (glslopt_get_status (shader)) { newSource = glslopt_get_output (shader); } else { errorLog = glslopt_get_log (shader); } glslopt_shader_delete (shader); } glslopt_cleanup (ctx); */ struct glslopt_shader; struct glslopt_ctx; enum glslopt_shader_type { kGlslOptShaderVertex = 0, kGlslOptShaderFragment, }; // Options flags for glsl_optimize enum glslopt_options { kGlslOptionSkipPreprocessor = (1<<0), // Skip preprocessing shader source. Saves some time if you know you don't need it. kGlslOptionNotFullShader = (1<<1), // Passed shader is not the full shader source. This makes some optimizations weaker. }; // Optimizer target language enum glslopt_target { kGlslTargetOpenGL = 0, kGlslTargetOpenGLES20 = 1, kGlslTargetOpenGLES30 = 2, kGlslTargetMetal = 3, }; // Type info enum glslopt_basic_type { kGlslTypeFloat = 0, kGlslTypeInt, kGlslTypeBool, kGlslTypeTex2D, kGlslTypeTex3D, kGlslTypeTexCube, kGlslTypeTex2DShadow, kGlslTypeTex2DArray, kGlslTypeOther, kGlslTypeCount }; enum glslopt_precision { kGlslPrecHigh = 0, kGlslPrecMedium, kGlslPrecLow, kGlslPrecCount }; glslopt_ctx* glslopt_initialize (glslopt_target target); void glslopt_cleanup (glslopt_ctx* ctx); void glslopt_set_max_unroll_iterations (glslopt_ctx* ctx, unsigned iterations); glslopt_shader* glslopt_optimize (glslopt_ctx* ctx, glslopt_shader_type type, const char* shaderSource, unsigned options); bool glslopt_get_status (glslopt_shader* shader); const char* glslopt_get_output (glslopt_shader* shader); const char* glslopt_get_raw_output (glslopt_shader* shader); const char* glslopt_get_log (glslopt_shader* shader); void glslopt_shader_delete (glslopt_shader* shader); int glslopt_shader_get_input_count (glslopt_shader* shader); void glslopt_shader_get_input_desc (glslopt_shader* shader, int index, const char** outName, glslopt_basic_type* outType, glslopt_precision* outPrec, int* outVecSize, int* outMatSize, int* outArraySize, int* outLocation); int glslopt_shader_get_uniform_count (glslopt_shader* shader); int glslopt_shader_get_uniform_total_size (glslopt_shader* shader); void glslopt_shader_get_uniform_desc (glslopt_shader* shader, int index, const char** outName, glslopt_basic_type* outType, glslopt_precision* outPrec, int* outVecSize, int* outMatSize, int* outArraySize, int* outLocation); int glslopt_shader_get_texture_count (glslopt_shader* shader); void glslopt_shader_get_texture_desc (glslopt_shader* shader, int index, const char** outName, glslopt_basic_type* outType, glslopt_precision* outPrec, int* outVecSize, int* outMatSize, int* outArraySize, int* outLocation); // Get *very* approximate shader stats: // Number of math, texture and flow control instructions. void glslopt_shader_get_stats (glslopt_shader* shader, int* approxMath, int* approxTex, int* approxFlow); #endif /* GLSL_OPTIMIZER_H */