diff options
Diffstat (limited to 'emulator/opengl/tests/translator_tests')
6 files changed, 1030 insertions, 0 deletions
diff --git a/emulator/opengl/tests/translator_tests/GLES_CM/Android.mk b/emulator/opengl/tests/translator_tests/GLES_CM/Android.mk new file mode 100644 index 0000000..77cd272 --- /dev/null +++ b/emulator/opengl/tests/translator_tests/GLES_CM/Android.mk @@ -0,0 +1,32 @@ +LOCAL_PATH:= $(call my-dir) + +$(call emugl-begin-host-executable,triangleCM) +$(call emugl-import,libEGL_translator libGLES_CM_translator) + +PREBUILT := $(HOST_PREBUILT_TAG) +LOCAL_SDL_CONFIG ?= prebuilts/tools/$(PREBUILT)/sdl/bin/sdl-config +LOCAL_SDL_CFLAGS := $(shell $(LOCAL_SDL_CONFIG) --cflags) +LOCAL_SDL_LDLIBS := $(filter-out %.a %.lib,$(shell $(LOCAL_SDL_CONFIG) --static-libs)) + +ifeq ($(HOST_OS),darwin) + DARWIN_VERSION := $(strip $(shell sw_vers -productVersion)) + ifneq ($(filter 10.7 10.7.%,$(DARWIN_VERSION)),) + # Lion needs to be forced to link dylib to avoid problems + # with the dynamic function lookups in SDL 1.2 + LOCAL_SDL_LDLIBS += /usr/lib/dylib1.o + endif +endif + +LOCAL_SRC_FILES:= \ + triangleCM.cpp + +LOCAL_CFLAGS += $(LOCAL_SDL_CFLAGS) -g -O0 +LOCAL_LDLIBS += $(LOCAL_SDL_LDLIBS) + +LOCAL_STATIC_LIBRARIES += libSDL libSDLmain + +ifeq ($(HOST_OS),darwin) +$(call emugl-import,libMac_view) +endif + +$(call emugl-end-module) diff --git a/emulator/opengl/tests/translator_tests/GLES_CM/triangleCM.cpp b/emulator/opengl/tests/translator_tests/GLES_CM/triangleCM.cpp new file mode 100644 index 0000000..7547cd0 --- /dev/null +++ b/emulator/opengl/tests/translator_tests/GLES_CM/triangleCM.cpp @@ -0,0 +1,463 @@ +/* +* Copyright 2011 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> + +//#define GL_API +//#define GL_APIENTRY + +#undef ANDROID +#include <EGL/egl.h> +#include <GLES/gl.h> + +#ifdef __APPLE__ +extern "C" void * createGLView(void *nsWindowPtr, int x, int y, int width, int height); +#endif + +#undef HAVE_MALLOC_H +#include <SDL.h> +#include <SDL_syswm.h> + + +#define WINDOW_WIDTH 500 +#define WINDOW_HEIGHT 500 + +#define TEX_WIDTH 256 +#define TEX_HEIGHT 256 + + +#define F_to_X(d) ((d) > 32767.65535 ? 32767 * 65536 + 65535 : \ + (d) < -32768.65535 ? -32768 * 65536 + 65535 : \ + ((GLfixed) ((d) * 65536))) +#define X_to_F(x) ((float)(x))/65536.0f + +static EGLint const attribute_list[] = { + EGL_RED_SIZE, 1, + EGL_GREEN_SIZE, 1, + EGL_BLUE_SIZE, 1, + EGL_NONE +}; + +unsigned char *genTexture(int width, int height, int comp) +{ + unsigned char *img = new unsigned char[width * height * comp]; + unsigned char *ptr = img; + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + unsigned char col = ((i / 8 + j / 8) % 2) * 255 ; + if (j>(width/2)) col/=2; + for (int c = 0; c < comp; c++) { + *ptr = col; ptr++; + } + } + } + return img; +} + +unsigned char *genRedTexture(int width, int height, int comp) +{ + unsigned char *img = new unsigned char[width * height * comp]; + memset(img,0,width*height*comp); + unsigned char *ptr = img; + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + unsigned char col = ((i / 8 + j / 8) % 2) * 255 ; + *ptr = col; + ptr+=comp; + } + } + return img; +} + +//mip 0; +unsigned char *genPalette4_rgb8(int width, int height,int color) +{ + int size = width*height/2 + 16*3/*palette size*/; + unsigned char *img = new unsigned char[size]; + + memset(img,0,size); + img[0] = 255; img[1] = 0; img[2] = 0; // red + img[3] = 0; img[4] = 0; img[5] = 255; //blue + img[7] = 128; img[8] = 0; img[9] = 128; //fucsia + //rest of the palette is empty + + unsigned char *ptr = img+(16*3); + for (int i = 0; i < (height*width/2); i++) { + ptr[i] = (i%2)?0x0|color:0x11|color; + } + return img; +} + +void usage(const char *progname) +{ + fprintf(stderr, "usage: %s [-n <nframes> -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"); +} + +#define SWITCH_SOURCE(add)\ + if(useConvertedType){ \ + if(useFixed){ \ + data = (GLvoid*)(fixedVertices+(add)); \ + } else { \ + data = (GLvoid*)(byteVertices +(add)); \ + } \ + } else { \ + data = (GLvoid*)(afVertices+(add)); \ + } \ + +#ifdef _WIN32 +int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) +#else +int main(int argc, char **argv) +#endif +{ + GLuint ui32Vbo = 0; // Vertex buffer object handle + GLuint ui32IndexVbo; + GLuint ui32Texture; + + int nframes = 100; + bool immidateMode = false; + bool useIndices = true; + bool useTexture = false; + bool useCompTexture = false; + bool useConvertedType = true; + bool useFixed = false; + bool usePoints = false; + bool useCopy = false; + bool useSubCopy = false; + + int c; + extern char *optarg; + + #ifdef _WIN32 + HWND windowId = NULL; + #elif __linux__ + Window windowId = NULL; + #elif __APPLE__ + void* windowId = NULL; + #endif + + // // Inialize SDL window + // + if (SDL_Init(SDL_INIT_NOPARACHUTE | SDL_INIT_VIDEO)) { + fprintf(stderr,"SDL init failed: %s\n", SDL_GetError()); + return -1; + } + + SDL_Surface *surface = SDL_SetVideoMode(WINDOW_WIDTH,WINDOW_HEIGHT, 32, SDL_HWSURFACE); + if (surface == NULL) { + fprintf(stderr,"Failed to set video mode: %s\n", SDL_GetError()); + return -1; + } + + SDL_SysWMinfo wminfo; + memset(&wminfo, 0, sizeof(wminfo)); + SDL_GetWMInfo(&wminfo); + #ifdef _WIN32 + windowId = wminfo.window; + #elif __linux__ + windowId = wminfo.info.x11.window; + #elif __APPLE__ + windowId = createGLView(wminfo.nsWindowPtr,0,0,WINDOW_WIDTH,WINDOW_HEIGHT); + + #endif + + int major,minor,num_config; + EGLConfig configs[150]; + EGLSurface egl_surface; + EGLContext ctx; + EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY); + eglInitialize(d,&major,&minor); + printf("DISPLAY == %p major =%d minor = %d\n",d,major,minor); + eglChooseConfig(d, attribute_list, configs, 150, &num_config); + printf("config returned %d\n",num_config); + egl_surface = eglCreateWindowSurface(d,configs[0],windowId,NULL); + printf("before creating context..\n"); + ctx = eglCreateContext(d,configs[0],EGL_NO_CONTEXT,NULL); + printf("SURFACE == %p CONTEXT == %p\n",egl_surface,ctx); + if(eglMakeCurrent(d,egl_surface,egl_surface,ctx)!= EGL_TRUE){ + printf("make current failed\n"); + return false; + } + printf("after make current\n"); + + GLenum err = glGetError(); + if(err != GL_NO_ERROR) { + printf("error before drawing ->>> %d \n",err); + } else { + printf("no error before drawing\n"); + } + + if (useTexture) { + + glEnable(GL_TEXTURE_2D); + ui32Texture = 1; + glBindTexture(GL_TEXTURE_2D, ui32Texture); + GLenum err = glGetError(); + + unsigned char *pixels = NULL; + if(useCompTexture) { + pixels = genPalette4_rgb8(TEX_WIDTH,TEX_HEIGHT,3); + glCompressedTexImage2D(GL_TEXTURE_2D,0,GL_PALETTE4_RGB8_OES,TEX_WIDTH,TEX_HEIGHT,0,3*16+TEX_WIDTH*TEX_HEIGHT/2,pixels); + + } else { + pixels = genTexture(TEX_WIDTH, TEX_HEIGHT, 4); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + } + + delete pixels; + + err = glGetError(); + if(err != GL_NO_ERROR) + printf("error %d after image \n",err); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + err = glGetError(); + if(err != GL_NO_ERROR) + printf("error after min filter \n"); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + err = glGetError(); + if(err != GL_NO_ERROR) + printf("error after mag filter \n"); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + err = glGetError(); + if(err != GL_NO_ERROR) + printf("error after env mode \n"); + + if(useCompTexture) { + pixels = genPalette4_rgb8(TEX_WIDTH,TEX_HEIGHT,1); + glCompressedTexSubImage2D(GL_TEXTURE_2D,0,TEX_WIDTH/4,TEX_HEIGHT/4,TEX_WIDTH/8,TEX_HEIGHT/8,GL_PALETTE4_RGB8_OES,3*16+(TEX_WIDTH*TEX_HEIGHT/128),pixels); + } else { + pixels = genRedTexture(TEX_WIDTH/8, TEX_HEIGHT/8, 4); + glTexSubImage2D(GL_TEXTURE_2D,0,TEX_WIDTH/4,TEX_HEIGHT/4,TEX_WIDTH/8,TEX_HEIGHT/8,GL_RGBA,GL_UNSIGNED_BYTE,pixels); + } + err = glGetError(); + if(err != GL_NO_ERROR) + printf("error %d after subimage \n",err); + delete pixels; + + } + + glClearColor(0.6f, 0.8f, 1.0f, 1.0f); // clear blue + + float afVertices[] = { -0.4f,-0.4f,0.0f, // Position + 1.0f,0.0f,0.0f,1.0f, // Color + 0.0f, 0.0f, // texture + 12.f, //point size + + 0.4f,-0.4f,0.0f, + 0.0f,1.0f,0.0f,1.0f, + 1.0f, 0.0f, + 47.0f, + + 0.0f,0.4f,0.0f, + 0.0f,0.0f,1.0f,1.0f, + 0.5f, 1.0f, + 14.0f + }; + +#define MAX_T 1 +#define MID_T 0 +#define MIN_T 0 + + GLbyte byteVertices[] = { -1,-1,0, // Position + 255,0,0,255, // Color + MIN_T, MIN_T, // texture + 12, //point size + + 1,-1,0, + 0,255,0,255, + MAX_T,MIN_T, + 47, + + 0,1,0, + 0,0,255,255, + MID_T, MAX_T, + 14 + }; + + GLfixed fixedVertices[] = { F_to_X(-0.4f),F_to_X(-0.4f),F_to_X(0.0f), // Position + F_to_X(1.0f),F_to_X(0.0f),F_to_X(0.0f),F_to_X(1.0f), // Color + F_to_X(0.0f),F_to_X(0.0f), // texture + F_to_X(12.0f),//points size + + F_to_X(0.4f),F_to_X(-0.4f),F_to_X(0.0f), + F_to_X(0.0f),F_to_X(1.0f),F_to_X(0.0f),F_to_X(1.0f), + F_to_X(1.0f),F_to_X( 0.0f), + F_to_X(30.0f), + + F_to_X(0.0f),F_to_X(0.4f),F_to_X(0.0f), + F_to_X(0.0f),F_to_X(0.0f),F_to_X(1.0f),F_to_X(1.0f), + F_to_X(0.5f), F_to_X(1.0f), + F_to_X(30.0) + }; + + unsigned short indices[] = { 2, 1, 0 }; + + if (!immidateMode) { + glGenBuffers(1, &ui32Vbo); + ui32Vbo = 1; + printf("ui32Vbo = %d\n", ui32Vbo); + + glBindBuffer(GL_ARRAY_BUFFER, ui32Vbo); + void* data = (void*)afVertices; + unsigned int uiSize = 3*(sizeof(float)*10); + if(useConvertedType){ + if(useFixed){ + data = (void*)fixedVertices; + } else { + data = (void*)byteVertices; + uiSize = 3*(sizeof(GLbyte)*10); + } + } + glBufferData(GL_ARRAY_BUFFER, uiSize,data, GL_STATIC_DRAW); + + ui32IndexVbo = 2; + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ui32IndexVbo); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); + } + + // Draws a triangle for 800 frames + float angle = 0.0; + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + GLvoid* arr = NULL; + GLenum type; + GLenum drawType; + GLenum colorType; + int size_of; + + if(useConvertedType){ + if(useFixed) + { + arr = fixedVertices; + colorType = type = GL_FIXED; + size_of = sizeof(GLfixed); + } else { + arr = byteVertices; + colorType = GL_UNSIGNED_BYTE; + type = GL_BYTE; + size_of = sizeof(GLbyte); + } + }else { + arr = afVertices; + colorType = type = GL_FLOAT; + size_of = sizeof(float); + } + + if(usePoints) + { + drawType = GL_POINTS; + } + else + drawType = GL_TRIANGLES; + + GLvoid* data = NULL; + for (int i = 0; i < 100; i++) { + + glClear(GL_COLOR_BUFFER_BIT); + glPushMatrix(); + glRotatef(angle, 0.0, 0.0, 1.0); + angle += 360.0 / nframes; + // Enable vertex arrays + glEnableClientState(GL_VERTEX_ARRAY); + if (immidateMode) { + glVertexPointer(3,type, size_of * 10, arr); + } else { + glVertexPointer(3,type, size_of * 10, 0); + } + + // Set color data in the same way + glEnableClientState(GL_COLOR_ARRAY); + if (immidateMode) { + SWITCH_SOURCE(3) + glColorPointer(4, colorType, size_of * 10, data); + } else { + glColorPointer(4,colorType,size_of * 10, (GLvoid*) (size_of * 3) ); + } + if (useTexture) { + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + if (immidateMode) { + SWITCH_SOURCE(7) + glTexCoordPointer(2, type, size_of * 10,data); + } else { + glTexCoordPointer(2, type, size_of * 10, (GLvoid*)(size_of * 7)); + } + } + if(usePoints) + { + glEnableClientState(GL_POINT_SIZE_ARRAY_OES); + if (immidateMode) { + SWITCH_SOURCE(9) + glPointSizePointerOES(type,size_of * 10,data); + } else { + glPointSizePointerOES(type,size_of * 10,(GLvoid*)(size_of * 9)); + } + } + + if (useIndices) { + if (immidateMode) { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glDrawElements(drawType, 3, GL_UNSIGNED_SHORT, indices); + } else { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ui32IndexVbo); + glDrawElements(drawType, 3, GL_UNSIGNED_SHORT, 0); + } + } else { + glDrawArrays(drawType, 0, 3); + } + + GLenum err = glGetError(); + if(err != GL_NO_ERROR) + printf(" error %d has occured while drawing\n",err); + + + glPopMatrix(); + eglSwapBuffers(d,egl_surface); + + if(useTexture && useCopy) + glCopyTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,0,0,256,256,0); + else if(useTexture && useSubCopy) + glCopyTexSubImage2D(GL_TEXTURE_2D,0,100,100,WINDOW_WIDTH/2,WINDOW_HEIGHT/2,50,50); + } + err = glGetError(); + if(err != GL_NO_ERROR) + printf("error ->>> %d \n",err); + eglDestroySurface(d,egl_surface); + eglDestroyContext(d,ctx); + +// Just wait until the window is closed + SDL_Event ev; + while( SDL_WaitEvent(&ev) ) { + if (ev.type == SDL_QUIT) { + break; + } + } + return 0; +} + + diff --git a/emulator/opengl/tests/translator_tests/GLES_V2/Android.mk b/emulator/opengl/tests/translator_tests/GLES_V2/Android.mk new file mode 100644 index 0000000..53f774c --- /dev/null +++ b/emulator/opengl/tests/translator_tests/GLES_V2/Android.mk @@ -0,0 +1,30 @@ +LOCAL_PATH:= $(call my-dir) + +$(call emugl-begin-host-executable,triangleV2) +$(call emugl-import,libEGL_translator libGLES_V2_translator) + +PREBUILT := $(HOST_PREBUILT_TAG) +LOCAL_SDL_CONFIG ?= prebuilts/tools/$(PREBUILT)/sdl/bin/sdl-config +LOCAL_SDL_CFLAGS := $(shell $(LOCAL_SDL_CONFIG) --cflags) +LOCAL_SDL_LDLIBS := $(filter-out %.a %.lib,$(shell $(LOCAL_SDL_CONFIG) --static-libs)) + +LOCAL_SRC_FILES:= \ + triangleV2.cpp + +LOCAL_CFLAGS += $(LOCAL_SDL_CFLAGS) -g -O0 +LOCAL_LDLIBS += $(LOCAL_SDL_LDLIBS) + +LOCAL_STATIC_LIBRARIES += libSDL libSDLmain + +ifeq ($(HOST_OS),darwin) +DARWIN_VERSION := $(strip $(shell sw_vers -productVersion)) +ifneq ($(filter 10.7 10.7.%,$(DARWIN_VERSION)),) + # Lion needs to be forced to link dylib to avoid problems + # with the dynamic function lookups in SDL 1.2 + LOCAL_LDLIBS += /usr/lib/dylib1.o +endif +$(call emugl-import,libMac_view) +endif + +$(call emugl-end-module) + diff --git a/emulator/opengl/tests/translator_tests/GLES_V2/triangleV2.cpp b/emulator/opengl/tests/translator_tests/GLES_V2/triangleV2.cpp new file mode 100644 index 0000000..59535c5 --- /dev/null +++ b/emulator/opengl/tests/translator_tests/GLES_V2/triangleV2.cpp @@ -0,0 +1,457 @@ +/* +* Copyright 2011 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> + +//#define GL_API +//#define GL_APIENTRY + +#undef ANDROID +#include <EGL/egl.h> +#include <GLES2/gl2.h> + +#ifdef __APPLE__ +extern "C" void * createGLView(void *nsWindowPtr, int x, int y, int width, int height); +#endif + +#undef HAVE_MALLOC_H +#include <SDL.h> +#include <SDL_syswm.h> + + +#define WINDOW_WIDTH 500 +#define WINDOW_HEIGHT 500 + +#define TEX_WIDTH 256 +#define TEX_HEIGHT 256 + + +#define F_to_X(d) ((d) > 32767.65535 ? 32767 * 65536 + 65535 : \ + (d) < -32768.65535 ? -32768 * 65536 + 65535 : \ + ((GLfixed) ((d) * 65536))) +#define X_to_F(x) ((float)(x))/65536.0f + +//#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, + EGL_BLUE_SIZE, 1, + EGL_NONE +}; + +unsigned char *genTexture(int width, int height, int comp) +{ + unsigned char *img = new unsigned char[width * height * comp]; + unsigned char *ptr = img; + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + unsigned char col = ((i / 8 + j / 8) % 2) * 255 ; + for (int c = 0; c < comp; c++) { + *ptr = col; ptr++; + } + } + } + return img; +} + +unsigned char *genRedTexture(int width, int height, int comp) +{ + unsigned char *img = new unsigned char[width * height * comp]; + memset(img,0,width*height*comp); + unsigned char *ptr = img; + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + unsigned char col = ((i / 8 + j / 8) % 2) * 255 ; + *ptr = col; + ptr+=comp; + } + } + return img; +} + + +void printUsage(const char *progname) +{ + fprintf(stderr, "usage: %s [options]\n", progname); + fprintf(stderr, "\t-vs <filename> - vertex shader to use\n"); + fprintf(stderr, "\t-fs <filename> - fragment shader to use\n"); +} + + + +GLuint LoadShader(GLenum type,const char *shaderSrc) +{ + GLuint shader; + GLint compiled; + // Create the shader object + shader = glCreateShader(type); + if(shader == 0) + return 0; + // Load the shader source + glShaderSource(shader, 1, &shaderSrc, NULL); + // Compile the shader + glCompileShader(shader); + // Check the compile status + glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); + if(!compiled) + { + GLint infoLen = 0; + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen); + if(infoLen > 1) + { + char* infoLog = (char*)malloc(sizeof(char) * infoLen); + glGetShaderInfoLog(shader, infoLen, NULL, infoLog); + printf("Error compiling shader:\n%s\n", infoLog); + free(infoLog); + } + glDeleteShader(shader); + return 0; + } + 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 +// +int Init(const char *vShaderStr, const char *fShaderStr) +{ + GLuint vertexShader; + GLuint fragmentShader; + GLuint programObject; + GLint linked; + // Load the vertex/fragment shaders + vertexShader = LoadShader(GL_VERTEX_SHADER, vShaderStr); + fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fShaderStr); + // Create the program object + programObject = glCreateProgram(); + if(programObject == 0) + return -1; + glAttachShader(programObject, vertexShader); + glAttachShader(programObject, fragmentShader); + // Bind vPosition to attribute 0 + glBindAttribLocation(programObject, 0, "vPosition"); + // Link the program + glLinkProgram(programObject); + // Check the link status + glGetProgramiv(programObject, GL_LINK_STATUS, &linked); + if(!linked) + { + GLint infoLen = 0; + glGetProgramiv(programObject, GL_INFO_LOG_LENGTH, &infoLen); + if(infoLen > 1) + { + char* infoLog = (char*)malloc(sizeof(char) * infoLen); + glGetProgramInfoLog(programObject, infoLen, NULL, infoLog); + printf("Error linking program:\n%s\n", infoLog); + free(infoLog); + } + glDeleteProgram(programObject); + return -1; + } + + // dump active uniforms + dumpUniforms(programObject); + + // Store the program object +#ifndef __FIXED__ + glClearColor(0.0f, 0.0f, 1.0f, 1.0f); +#else + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); +#endif + return programObject; +} + + +/// +// Draw a triangle using the shader pair created in Init() +// +void Draw(EGLDisplay display,EGLSurface surface,int width,int height,GLuint program) +{ +#ifndef __FIXED__ + GLfloat vVertices[] = {0.0f, 0.5f, 0.0f, + -0.5f, -0.5f, 0.0f, + 0.5f, -0.5f, 0.0f}; +#else + + GLfixed vVertices[] = {F_to_X(0.0f), F_to_X(0.5f),F_to_X(0.0f), + F_to_X(-0.5f),F_to_X(-0.5f), F_to_X(0.0f), + F_to_X(0.5f),F_to_X(-0.5f),F_to_X(0.0f)}; +#endif + + // Set the viewport + glViewport(0, 0,width,height); + // Clear the color buffer + glClear(GL_COLOR_BUFFER_BIT); + // Use the program object + glUseProgram(program); + // Load the vertex data +#ifndef __FIXED__ + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices); +#else + glVertexAttribPointer(0, 3, GL_FIXED, GL_FALSE, 0, vVertices); +#endif + glEnableVertexAttribArray(0); + glDrawArrays(GL_TRIANGLES, 0, 3); + 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 +int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) +#else +int main(int argc, char **argv) +#endif +{ + GLuint ui32Vbo = 0; // Vertex buffer object handle + GLuint ui32IndexVbo; + GLuint ui32Texture; + + int nframes = 100; + bool immidateMode = false; + bool useIndices = false; + bool useTexture = true; + bool useCompTexture = false; + bool useFixed = true; + bool usePoints = false; + bool useCopy = false; + bool useSubCopy = false; + +#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; 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 + HWND windowId = NULL; + #elif __linux__ + Window windowId = NULL; + #elif __APPLE__ + void* windowId = NULL; + #endif + + // // Inialize SDL window + // + if (SDL_Init(SDL_INIT_NOPARACHUTE | SDL_INIT_VIDEO)) { + fprintf(stderr,"SDL init failed: %s\n", SDL_GetError()); + return -1; + } + + SDL_Surface *surface = SDL_SetVideoMode(WINDOW_WIDTH,WINDOW_HEIGHT, 32, SDL_HWSURFACE); + if (surface == NULL) { + fprintf(stderr,"Failed to set video mode: %s\n", SDL_GetError()); + return -1; + } + + SDL_SysWMinfo wminfo; + memset(&wminfo, 0, sizeof(wminfo)); + SDL_GetWMInfo(&wminfo); + #ifdef _WIN32 + windowId = wminfo.window; + #elif __linux__ + windowId = wminfo.info.x11.window; + #elif __APPLE__ + windowId = createGLView(wminfo.nsWindowPtr,0,0,WINDOW_WIDTH,WINDOW_HEIGHT); + #endif + + int major,minor,num_config; + int attrib_list[] ={ + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; + EGLConfig configs[150]; + EGLSurface egl_surface; + EGLContext ctx; + EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY); + eglInitialize(d,&major,&minor); + printf("DISPLAY == %p major =%d minor = %d\n",d,major,minor); + eglChooseConfig(d, attribute_list, configs, 150, &num_config); + printf("config returned %d\n",num_config); + egl_surface = eglCreateWindowSurface(d,configs[0],windowId,NULL); + ctx = eglCreateContext(d,configs[0],EGL_NO_CONTEXT,attrib_list); + printf("SURFACE == %p CONTEXT == %p\n",egl_surface,ctx); + if(eglMakeCurrent(d,egl_surface,egl_surface,ctx)!= EGL_TRUE){ + printf("make current failed\n"); + return false; + } + printf("after make current\n"); + + GLenum err = glGetError(); + if(err != GL_NO_ERROR) { + printf("error before drawing ->>> %d \n",err); + } else { + printf("no error before drawing\n"); + } + + int program = Init(vShader, fShader); + if(program < 0){ + printf("failed init shaders\n"); + return false; + } + + Draw(d,egl_surface,WINDOW_WIDTH,WINDOW_HEIGHT,program); + + err = glGetError(); + if(err != GL_NO_ERROR) + printf("error ->>> %d \n",err); + eglDestroySurface(d,egl_surface); + eglDestroyContext(d,ctx); + +// Just wait until the window is closed + SDL_Event ev; + while( SDL_WaitEvent(&ev) ) { + if (ev.type == SDL_QUIT) { + break; + } + } + return 0; +} + + diff --git a/emulator/opengl/tests/translator_tests/MacCommon/Android.mk b/emulator/opengl/tests/translator_tests/MacCommon/Android.mk new file mode 100644 index 0000000..4c4ae6b --- /dev/null +++ b/emulator/opengl/tests/translator_tests/MacCommon/Android.mk @@ -0,0 +1,13 @@ +LOCAL_PATH := $(call my-dir) + +ifeq ($(HOST_OS),darwin) +$(call emugl-begin-host-static-library,libMac_view) + +LIBMACVIEW_FRAMEWORKS := AppKit AudioToolbox AudioUnit +LIBMACVIEW_PREFIX := -Wl,-framework, + +$(call emugl-export,LDLIBS,$(foreach _framework,$(LIBMACVIEW_FRAMEWORKS),$(LIBMACVIEW_PREFIX)$(_framework))) +LOCAL_SRC_FILES := setup_gl.m +LOCAL_CFLAGS += -g -O0 +$(call emugl-end-module) +endif # HOST_OS == darwin diff --git a/emulator/opengl/tests/translator_tests/MacCommon/setup_gl.m b/emulator/opengl/tests/translator_tests/MacCommon/setup_gl.m new file mode 100644 index 0000000..a300943 --- /dev/null +++ b/emulator/opengl/tests/translator_tests/MacCommon/setup_gl.m @@ -0,0 +1,35 @@ +/* +* Copyright 2011 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include <stdio.h> +#include <Cocoa/Cocoa.h> + + void * createGLView(void *nsWindowPtr, int x, int y, int width, int height) +{ + NSRect contentRect = NSMakeRect(x, y, width, height); + NSView *glView = [[NSView alloc] initWithFrame:contentRect]; + if (glView == nil) { + printf("couldn't create opengl view\n"); + return nil; + } + [glView setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable]; + NSWindow *win = (NSWindow *)nsWindowPtr; + [[win contentView] addSubview:glView]; + [win makeKeyAndOrderFront:nil]; + return (void *)glView; +} + + |