From 0d5ea9bb6937450f68446b3e720c5fa92137e4fe Mon Sep 17 00:00:00 2001 From: Guy Zadickario Date: Sun, 31 Jul 2011 10:37:46 +0300 Subject: [PATCH] opengles emulator: test: added shader flags to triangleV2 test Added the ability to provide external vertex and fragment shader files to the test application triangleV2. That makes easy to test various shaders we see failing in applications. Change-Id: Ifaae8490ac76c022aa712ae516355658922b47bd --- .../translator_tests/GLES_V2/triangleV2.cpp | 176 +++++++++++++++--- 1 file changed, 147 insertions(+), 29 deletions(-) diff --git a/tools/emulator/opengl/tests/translator_tests/GLES_V2/triangleV2.cpp b/tools/emulator/opengl/tests/translator_tests/GLES_V2/triangleV2.cpp index 0321b7d18..d231b366b 100644 --- a/tools/emulator/opengl/tests/translator_tests/GLES_V2/triangleV2.cpp +++ b/tools/emulator/opengl/tests/translator_tests/GLES_V2/triangleV2.cpp @@ -33,6 +33,24 @@ extern "C" void * createGLView(void *nsWindowPtr, int x, int y, int width, int h //#define __FIXED__ +const char *def_vShaderStr = + "attribute vec4 vPosition; \n" + "void main() \n" + "{ \n" + " gl_Position = vPosition; \n" + "} \n"; + +const char *def_fShaderStr = + "precision mediump float; \n" + "void main() \n" + "{ \n" +#ifndef __FIXED__ + " gl_FragColor = vec4(0.2, 0.5, 0.1, 1.0); \n" +#else + " gl_FragColor = vec4(0.4, 0.3, 0.7, 1.0); \n" +#endif + "} \n"; + static EGLint const attribute_list[] = { EGL_RED_SIZE, 1, EGL_GREEN_SIZE, 1, @@ -71,16 +89,11 @@ unsigned char *genRedTexture(int width, int height, int comp) } -void usage(const char *progname) +void printUsage(const char *progname) { - fprintf(stderr, "usage: %s [-n -i -h]\n", progname); - fprintf(stderr, "\t-h: this message\n"); - fprintf(stderr, "\t-i: immidate mode\n"); - fprintf(stderr, "\t-n nframes: generate nframes\n"); - fprintf(stderr, "\t-e: use index arrays\n"); - fprintf(stderr, "\t-t: use texture\n"); - fprintf(stderr, "\t-f: use fixed points\n"); - fprintf(stderr, "\t-p: use point size OES extention\n"); + fprintf(stderr, "usage: %s [options]\n", progname); + fprintf(stderr, "\t-vs - vertex shader to use\n"); + fprintf(stderr, "\t-fs - fragment shader to use\n"); } @@ -115,27 +128,51 @@ GLuint LoadShader(GLenum type,const char *shaderSrc) } return shader; } + +const char *readShader(const char *fileName) +{ + FILE *fp = fopen(fileName, "rb"); + if (!fp) return NULL; + + int bSize = 1024; + int nBufs = 1; + char *buf = (char *)malloc(bSize); + int n; + int len = 0; + n = fread(&buf[0], 1, bSize, fp); + while( n == bSize ) { + len += n; + nBufs++; + buf = (char *)realloc(buf, bSize * nBufs); + n = fread(&buf[len], 1, bSize, fp); + } + len += n; + + buf[len] = '\0'; + return (const char *)buf; +} + +void dumpUniforms(GLuint program) +{ + GLint numU; + glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &numU); + printf("==== Program %d has %d active uniforms ===\n", program, numU); + char name[512]; + GLsizei len; + GLint size; + GLenum type; + for (int i=0; i= argvSize) { + argvSize *= 2; + argv = (char **)realloc(argv, argvSize * sizeof(char *)); + } + argv[(*argc)++] = &cmdLine[argStart]; + argStart = i+1; + } + + prevIsSpace = isSpace; + i++; + } + + if (i > argStart) { + argv[(*argc)++] = &cmdLine[argStart]; + } + return argv; +} +#endif + #ifdef _WIN32 int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) #else @@ -232,8 +311,47 @@ int main(int argc, char **argv) bool useCopy = false; bool useSubCopy = false; - int c; - extern char *optarg; +#ifdef _WIN32 + int argc; + char **argv = parseCmdLine(lpCmdLine, &argc); +#endif + const char *vShader = def_vShaderStr; + const char *fShader = def_fShaderStr; + + for (int i=1; i= argc) { + printUsage(argv[0]); + return -1; + } + vShader = readShader(argv[i]); + if (!vShader) { + vShader = def_vShaderStr; + printf("Failed to load vshader %s, using defualt\n", argv[i]); + } + else { + printf("Using vshader %s\n", argv[i]); + } + } + else if (!strcmp(argv[i],"-fs")) { + if (++i >= argc) { + printUsage(argv[0]); + return -1; + } + fShader = readShader(argv[i]); + if (!fShader) { + fShader = def_fShaderStr; + printf("Failed to load fshader %s, using defualt\n", argv[i]); + } + else { + printf("Using fshader %s\n", argv[i]); + } + } + else { + printUsage(argv[0]); + return -1; + } + } #ifdef _WIN32 HWND windowId = NULL; @@ -296,7 +414,7 @@ int main(int argc, char **argv) printf("no error before drawing\n"); } - int program = Init(); + int program = Init(vShader, fShader); if(program < 0){ printf("failed init shaders\n"); return false;