extraction of linked binary program to a file using glGetProgramBinary. This file is intended to be loaded by glProgramBinary in the graphic application running on the target system.
A new option, '--out=<file name>' is available to be used for specifying the output file name. v2: 1. define MAX_LOG_LEN and use it as the size of gl log 2. define MAX_PROG_SIZE and use it as the max size of extracted shader_program 3. out_file is now pointer allocated by strdup for the file name Signed-off-by: Dongwon Kim <dongwon....@intel.com> --- run.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/run.c b/run.c index d066567..df466eb 100644 --- a/run.c +++ b/run.c @@ -52,6 +52,9 @@ #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#define MAX_LOG_LEN 4096 +#define MAX_PROG_SIZE (10*1024*1024) /* maximum 10MB for shader program */ + struct context_info { char *extension_string; int extension_string_len; @@ -358,18 +361,20 @@ const struct platform platforms[] = { enum { PCI_ID_OVERRIDE_OPTION = CHAR_MAX + 1, + OUT_PROGRAM_OPTION, }; const struct option const long_options[] = { {"pciid", required_argument, NULL, PCI_ID_OVERRIDE_OPTION}, + {"out", required_argument, NULL, OUT_PROGRAM_OPTION}, {NULL, 0, NULL, 0} }; void print_usage(const char *prog_name) { fprintf(stderr, - "Usage: %s [-d <device>] [-j <max_threads>] [-o <driver>] [-p <platform>] [--pciid=<chip id of targetted gen arch>] <directories and *.shader_test files>\n", + "Usage: %s [-d <device>] [-j <max_threads>] [-o <driver>] [-p <platform>] [--pciid=<chip id of targetted gen arch>] [--out=<file name of output shader program>] <directories and *.shader_test files>\n", prog_name); } @@ -450,6 +455,7 @@ main(int argc, char **argv) int opt; bool platf_overridden = 0; bool pci_id_overridden = 0; + char *out_file = NULL; max_threads = omp_get_max_threads(); @@ -518,6 +524,14 @@ main(int argc, char **argv) setenv("INTEL_DEVID_OVERRIDE", optarg, 1); pci_id_overridden = 1; break; + case OUT_PROGRAM_OPTION: + if (optarg[0] == 0) { + fprintf(stderr, "Output file name is empty.\n"); + return -1; + } + out_file = strdup(optarg); + assert(out_file != NULL); + break; default: fprintf(stderr, "Unknown option: %x\n", opt); print_usage(argv[0]); @@ -751,6 +765,8 @@ main(int argc, char **argv) EGLContext compat_ctx = create_context(egl_dpy, cfg, TYPE_COMPAT); if (compat_ctx == EGL_NO_CONTEXT) { fprintf(stderr, "ERROR: eglCreateContext() failed\n"); + if (out_file) + free(out_file); exit(-1); } @@ -858,18 +874,18 @@ main(int argc, char **argv) } } else if (type == TYPE_CORE || type == TYPE_COMPAT || type == TYPE_ES) { GLuint prog = glCreateProgram(); + GLint param; for (unsigned i = 0; i < num_shaders; i++) { GLuint s = glCreateShader(shader[i].type); glShaderSource(s, 1, &shader[i].text, &shader[i].length); glCompileShader(s); - GLint param; glGetShaderiv(s, GL_COMPILE_STATUS, ¶m); if (unlikely(!param)) { - GLchar log[4096]; + GLchar log[MAX_LOG_LEN]; GLsizei length; - glGetShaderInfoLog(s, 4096, &length, log); + glGetShaderInfoLog(s, sizeof(log), &length, log); fprintf(stderr, "ERROR: %s failed to compile:\n%s\n", current_shader_name, log); @@ -879,6 +895,36 @@ main(int argc, char **argv) } glLinkProgram(prog); + + glGetProgramiv(prog, GL_LINK_STATUS, ¶m); + if (unlikely(!param)) { + GLchar log[MAX_LOG_LEN]; + GLsizei length; + glGetProgramInfoLog(prog, sizeof(log), &length, log); + + fprintf(stderr, "ERROR: failed to link progam:\n%s\n", + log); + } else { + char *prog_buf = (char *)malloc(MAX_PROG_SIZE); + GLenum format; + GLsizei length; + FILE *fp; + + glGetProgramBinary(prog, MAX_PROG_SIZE, &length, &format, prog_buf); + + param = glGetError(); + if (param != GL_NO_ERROR) { + fprintf(stderr, "ERROR: failed to get Program Binary\n"); + } else { + fp = fopen(out_file, "wb"); + fprintf(stdout, "Binary program is generated (%d Byte).\n", length); + fprintf(stdout, "Binary Format is %d\n", format); + fprintf(stdout, "Now writing to the file\n"); + fwrite(prog_buf, sizeof(char), length, fp); + fclose(fp); + } + free(prog_buf); + } glDeleteProgram(prog); } else { for (unsigned i = 0; i < num_shaders; i++) { @@ -932,5 +978,8 @@ main(int argc, char **argv) close_fd: close(fd); + if (out_file) + free(out_file); + return ret; } -- 2.16.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev