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
This commit is contained in:
committed by
David 'Digit' Turner
parent
6d0f92b88d
commit
0d5ea9bb69
@@ -33,6 +33,24 @@ extern "C" void * createGLView(void *nsWindowPtr, int x, int y, int width, int h
|
|||||||
|
|
||||||
//#define __FIXED__
|
//#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[] = {
|
static EGLint const attribute_list[] = {
|
||||||
EGL_RED_SIZE, 1,
|
EGL_RED_SIZE, 1,
|
||||||
EGL_GREEN_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 <nframes> -i -h]\n", progname);
|
fprintf(stderr, "usage: %s [options]\n", progname);
|
||||||
fprintf(stderr, "\t-h: this message\n");
|
fprintf(stderr, "\t-vs <filename> - vertex shader to use\n");
|
||||||
fprintf(stderr, "\t-i: immidate mode\n");
|
fprintf(stderr, "\t-fs <filename> - fragment shader to use\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");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -115,27 +128,51 @@ GLuint LoadShader(GLenum type,const char *shaderSrc)
|
|||||||
}
|
}
|
||||||
return shader;
|
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<numU; i++) {
|
||||||
|
glGetActiveUniform(program, i,
|
||||||
|
512, &len, &size, &type, name);
|
||||||
|
printf("\t%s : type=0x%x size=%d\n", name, type, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
// Initialize the shader and program object
|
// Initialize the shader and program object
|
||||||
//
|
//
|
||||||
int Init()
|
int Init(const char *vShaderStr, const char *fShaderStr)
|
||||||
{
|
{
|
||||||
char vShaderStr[] =
|
|
||||||
"attribute vec4 vPosition; \n"
|
|
||||||
"void main() \n"
|
|
||||||
"{ \n"
|
|
||||||
" gl_Position = vPosition; \n"
|
|
||||||
"} \n";
|
|
||||||
char 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";
|
|
||||||
GLuint vertexShader;
|
GLuint vertexShader;
|
||||||
GLuint fragmentShader;
|
GLuint fragmentShader;
|
||||||
GLuint programObject;
|
GLuint programObject;
|
||||||
@@ -169,6 +206,10 @@ int Init()
|
|||||||
glDeleteProgram(programObject);
|
glDeleteProgram(programObject);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// dump active uniforms
|
||||||
|
dumpUniforms(programObject);
|
||||||
|
|
||||||
// Store the program object
|
// Store the program object
|
||||||
#ifndef __FIXED__
|
#ifndef __FIXED__
|
||||||
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
|
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
|
||||||
@@ -212,6 +253,44 @@ void Draw(EGLDisplay display,EGLSurface surface,int width,int height,GLuint prog
|
|||||||
eglSwapBuffers(display,surface);
|
eglSwapBuffers(display,surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
char **parseCmdLine(char *cmdLine, int *argc)
|
||||||
|
{
|
||||||
|
int argvSize = 10;
|
||||||
|
char **argv = (char **)malloc(argvSize * sizeof(char *));
|
||||||
|
*argc = 0;
|
||||||
|
int i=0;
|
||||||
|
bool prevIsSpace = true;
|
||||||
|
int argStart = 0;
|
||||||
|
|
||||||
|
argv[(*argc)++] = strdup("playdump");
|
||||||
|
|
||||||
|
while(cmdLine[i] != '\0') {
|
||||||
|
bool isSpace = (cmdLine[i] == ' ' || cmdLine[i] == '\t');
|
||||||
|
if ( !isSpace && prevIsSpace ) {
|
||||||
|
argStart = i;
|
||||||
|
}
|
||||||
|
else if (isSpace && !prevIsSpace) {
|
||||||
|
cmdLine[i] = '\0';
|
||||||
|
if (*argc >= 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
|
#ifdef _WIN32
|
||||||
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
|
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
|
||||||
#else
|
#else
|
||||||
@@ -232,8 +311,47 @@ int main(int argc, char **argv)
|
|||||||
bool useCopy = false;
|
bool useCopy = false;
|
||||||
bool useSubCopy = false;
|
bool useSubCopy = false;
|
||||||
|
|
||||||
int c;
|
#ifdef _WIN32
|
||||||
extern char *optarg;
|
int argc;
|
||||||
|
char **argv = parseCmdLine(lpCmdLine, &argc);
|
||||||
|
#endif
|
||||||
|
const char *vShader = def_vShaderStr;
|
||||||
|
const char *fShader = def_fShaderStr;
|
||||||
|
|
||||||
|
for (int i=1; i<argc; i++) {
|
||||||
|
if (!strcmp(argv[i],"-vs")) {
|
||||||
|
if (++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
|
#ifdef _WIN32
|
||||||
HWND windowId = NULL;
|
HWND windowId = NULL;
|
||||||
@@ -296,7 +414,7 @@ int main(int argc, char **argv)
|
|||||||
printf("no error before drawing\n");
|
printf("no error before drawing\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int program = Init();
|
int program = Init(vShader, fShader);
|
||||||
if(program < 0){
|
if(program < 0){
|
||||||
printf("failed init shaders\n");
|
printf("failed init shaders\n");
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user