summaryrefslogtreecommitdiffstats
path: root/third_party/rust/glslopt/glsl-optimizer/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/glslopt/glsl-optimizer/contrib')
-rw-r--r--third_party/rust/glslopt/glsl-optimizer/contrib/glslopt/Main.cpp159
-rw-r--r--third_party/rust/glslopt/glsl-optimizer/contrib/glslopt/Readme13
2 files changed, 172 insertions, 0 deletions
diff --git a/third_party/rust/glslopt/glsl-optimizer/contrib/glslopt/Main.cpp b/third_party/rust/glslopt/glsl-optimizer/contrib/glslopt/Main.cpp
new file mode 100644
index 0000000000..4f38dfe0dc
--- /dev/null
+++ b/third_party/rust/glslopt/glsl-optimizer/contrib/glslopt/Main.cpp
@@ -0,0 +1,159 @@
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "glsl_optimizer.h"
+
+static glslopt_ctx* gContext = 0;
+
+static int printhelp(const char* msg)
+{
+ if (msg) printf("%s\n\n\n", msg);
+ printf("Usage: glslopt <-f|-v> <input shader> [<output shader>]\n");
+ printf("\t-f : fragment shader (default)\n");
+ printf("\t-v : vertex shader\n");
+ printf("\t-1 : target OpenGL (default)\n");
+ printf("\t-2 : target OpenGL ES 2.0\n");
+ printf("\t-3 : target OpenGL ES 3.0\n");
+ printf("\n\tIf no output specified, output is to [input].out.\n");
+ return 1;
+}
+
+static bool init(glslopt_target target)
+{
+ gContext = glslopt_initialize(target);
+ if( !gContext )
+ return false;
+ return true;
+}
+
+static void term()
+{
+ glslopt_cleanup(gContext);
+}
+
+static char* loadFile(const char* filename)
+{
+ FILE* file = fopen(filename, "rt");
+ if( !file )
+ {
+ printf("Failed to open %s for reading\n", filename);
+ return 0;
+ }
+
+ fseek(file, 0, SEEK_END);
+ const int size = ftell(file);
+ fseek(file, 0, SEEK_SET);
+
+ char* result = new char[size+1];
+ const int count = (int)fread(result, 1, size, file);
+ result[count] = 0;
+
+ fclose(file);
+ return result;
+}
+
+static bool saveFile(const char* filename, const char* data)
+{
+ int size = (int)strlen(data);
+
+ FILE* file = fopen(filename, "wt");
+ if( !file )
+ {
+ printf( "Failed to open %s for writing\n", filename);
+ return false;
+ }
+
+ if( 1 != fwrite(data,size,1,file) )
+ {
+ printf( "Failed to write to %s\n", filename);
+ fclose(file);
+ return false;
+ }
+
+ fclose(file);
+ return true;
+}
+
+static bool compileShader(const char* dstfilename, const char* srcfilename, bool vertexShader)
+{
+ const char* originalShader = loadFile(srcfilename);
+ if( !originalShader )
+ return false;
+
+ const glslopt_shader_type type = vertexShader ? kGlslOptShaderVertex : kGlslOptShaderFragment;
+
+ glslopt_shader* shader = glslopt_optimize(gContext, type, originalShader, 0);
+ if( !glslopt_get_status(shader) )
+ {
+ printf( "Failed to compile %s:\n\n%s\n", srcfilename, glslopt_get_log(shader));
+ return false;
+ }
+
+ const char* optimizedShader = glslopt_get_output(shader);
+
+ if( !saveFile(dstfilename, optimizedShader) )
+ return false;
+
+ delete[] originalShader;
+ return true;
+}
+
+int main(int argc, char* argv[])
+{
+ if( argc < 3 )
+ return printhelp(NULL);
+
+ bool vertexShader = false, freename = false;
+ glslopt_target languageTarget = kGlslTargetOpenGL;
+ const char* source = 0;
+ char* dest = 0;
+
+ for( int i=1; i < argc; i++ )
+ {
+ if( argv[i][0] == '-' )
+ {
+ if( 0 == strcmp("-v", argv[i]) )
+ vertexShader = true;
+ else if( 0 == strcmp("-f", argv[i]) )
+ vertexShader = false;
+ else if( 0 == strcmp("-1", argv[i]) )
+ languageTarget = kGlslTargetOpenGL;
+ else if( 0 == strcmp("-2", argv[i]) )
+ languageTarget = kGlslTargetOpenGLES20;
+ else if( 0 == strcmp("-3", argv[i]) )
+ languageTarget = kGlslTargetOpenGLES30;
+ }
+ else
+ {
+ if( source == 0 )
+ source = argv[i];
+ else if( dest == 0 )
+ dest = argv[i];
+ }
+ }
+
+ if( !source )
+ return printhelp("Must give a source");
+
+ if( !init(languageTarget) )
+ {
+ printf("Failed to initialize glslopt!\n");
+ return 1;
+ }
+
+ if ( !dest ) {
+ dest = (char *) calloc(strlen(source)+5, sizeof(char));
+ snprintf(dest, strlen(source)+5, "%s.out", source);
+ freename = true;
+ }
+
+ int result = 0;
+ if( !compileShader(dest, source, vertexShader) )
+ result = 1;
+
+ if( freename ) free(dest);
+
+ term();
+ return result;
+}
diff --git a/third_party/rust/glslopt/glsl-optimizer/contrib/glslopt/Readme b/third_party/rust/glslopt/glsl-optimizer/contrib/glslopt/Readme
new file mode 100644
index 0000000000..7d28ecdda6
--- /dev/null
+++ b/third_party/rust/glslopt/glsl-optimizer/contrib/glslopt/Readme
@@ -0,0 +1,13 @@
+This is a small sample program to get you quickly up and running, it transforms an input textfile
+to an output textfile. The input source textfile should be a fully preprocessed GLSL shader and
+the output should be a simple shader in textform.
+
+The project file is generated by BadgerConfig.
+
+VS2005
+BadgerConfig
+
+
+
+
+Jim Tilander, Santa Monica 2010