diff options
Diffstat (limited to 'progs')
-rw-r--r-- | progs/demos/fbotexture.c | 28 | ||||
-rw-r--r-- | progs/egl/demo3.c | 2 | ||||
-rw-r--r-- | progs/glsl/multitex.shtest | 4 | ||||
-rw-r--r-- | progs/glsl/shtest.c | 99 | ||||
-rw-r--r-- | progs/util/shaderutil.c | 33 | ||||
-rw-r--r-- | progs/util/shaderutil.h | 6 | ||||
-rw-r--r-- | progs/xdemos/.gitignore | 1 |
7 files changed, 150 insertions, 23 deletions
diff --git a/progs/demos/fbotexture.c b/progs/demos/fbotexture.c index 3b36f755a0..56482663dc 100644 --- a/progs/demos/fbotexture.c +++ b/progs/demos/fbotexture.c @@ -498,7 +498,7 @@ SetupFunctionPointers(void) * Make FBO to render into given texture. */ static GLuint -MakeFBO_RenderTexture(GLuint TexObj) +MakeFBO_RenderTexture(GLuint texObj) { GLuint fb; GLint sizeFudge = 0; @@ -507,7 +507,7 @@ MakeFBO_RenderTexture(GLuint TexObj) glBindFramebuffer_func(GL_FRAMEBUFFER_EXT, fb); /* Render color to texture */ glFramebufferTexture2D_func(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, - TexTarget, TexObj, TextureLevel); + TexTarget, texObj, TextureLevel); if (Use_ARB_fbo) { /* use a smaller depth buffer to see what happens */ @@ -541,7 +541,7 @@ MakeFBO_RenderTexture(GLuint TexObj) /* queries */ { - GLint bits, w, h; + GLint bits, w, h, name; glBindRenderbuffer_func(GL_RENDERBUFFER_EXT, DepthRB); glGetRenderbufferParameteriv_func(GL_RENDERBUFFER_EXT, @@ -559,8 +559,28 @@ MakeFBO_RenderTexture(GLuint TexObj) glGetRenderbufferParameteriv_func(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_STENCIL_SIZE_EXT, &bits); printf("Stencil renderbuffer size = %d bits\n", bits); - } + glGetFramebufferAttachmentParameteriv_func(GL_FRAMEBUFFER_EXT, + GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT, + &name); + printf("Render to texture name: %d\n", texObj); + printf("Color attachment[0] name: %d\n", name); + assert(texObj == name); + + glGetFramebufferAttachmentParameteriv_func(GL_FRAMEBUFFER_EXT, + GL_STENCIL_ATTACHMENT, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT, + &name); + printf("Stencil attachment name: %d\n", name); + + glGetFramebufferAttachmentParameteriv_func(GL_FRAMEBUFFER_EXT, + GL_DEPTH_ATTACHMENT, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT, + &name); + printf("Depth attachment name: %d\n", name); + + } /* bind the regular framebuffer */ glBindFramebuffer_func(GL_FRAMEBUFFER_EXT, 0); diff --git a/progs/egl/demo3.c b/progs/egl/demo3.c index a6096a257e..daab62d173 100644 --- a/progs/egl/demo3.c +++ b/progs/egl/demo3.c @@ -551,7 +551,7 @@ write_ppm(const char *filename, const GLubyte *buffer, int width, int height) } } -#include "../src/egl/main/egldisplay.h" +#include "../../src/egl/main/egldisplay.h" typedef struct fb_display { diff --git a/progs/glsl/multitex.shtest b/progs/glsl/multitex.shtest index 5be45f6c7c..4b7c3fd4a5 100644 --- a/progs/glsl/multitex.shtest +++ b/progs/glsl/multitex.shtest @@ -1,6 +1,6 @@ vs multitex.vert fs multitex.frag -texture 0 ../images/tile.rgb -texture 1 ../images/tree2.rgba +texture 0 2D ../images/tile.rgb +texture 1 2D ../images/tree2.rgba uniform tex1 GL_SAMPLER_2D 0 uniform tex2 GL_SAMPLER_2D 1 diff --git a/progs/glsl/shtest.c b/progs/glsl/shtest.c index 2622af1313..fa477d9eeb 100644 --- a/progs/glsl/shtest.c +++ b/progs/glsl/shtest.c @@ -21,6 +21,9 @@ * fs shader.frag * uniform pi 3.14159 * uniform v1 1.0 0.5 0.2 0.3 + * texture 0 2D texture0.rgb + * texture 1 CUBE texture1.rgb + * texture 2 RECT texture2.rgb * */ @@ -255,7 +258,7 @@ Redisplay(void) glMatrixMode(GL_MODELVIEW); if (Object == SPHERE) { - Sphere(2.0, 20, 10); + Sphere(2.5, 20, 10); } else if (Object == CUBE) { Cube(2.0); @@ -376,13 +379,14 @@ InitUniforms(const struct config_file *conf, static void -LoadTexture(GLint unit, const char *texFileName) +LoadTexture(GLint unit, GLenum target, const char *texFileName) { GLint imgWidth, imgHeight; GLenum imgFormat; GLubyte *image = NULL; GLuint tex; GLenum filter = GL_LINEAR; + GLenum objTarget; image = LoadRGBImage(texFileName, &imgWidth, &imgHeight, &imgFormat); if (!image) { @@ -390,21 +394,41 @@ LoadTexture(GLint unit, const char *texFileName) exit(1); } - printf("Load Texture: unit %d: %s %d x %d\n", - unit, texFileName, imgWidth, imgHeight); + printf("Load Texture: unit %d, target 0x%x: %s %d x %d\n", + unit, target, texFileName, imgWidth, imgHeight); + + if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && + target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z) { + objTarget = GL_TEXTURE_CUBE_MAP; + } + else { + objTarget = target; + } glActiveTexture(GL_TEXTURE0 + unit); glGenTextures(1, &tex); - glBindTexture(GL_TEXTURE_2D, tex); + glBindTexture(objTarget, tex); + + if (target == GL_TEXTURE_3D) { + /* depth=1 */ + gluBuild3DMipmaps(target, 4, imgWidth, imgHeight, 1, + imgFormat, GL_UNSIGNED_BYTE, image); + } + else if (target == GL_TEXTURE_1D) { + gluBuild1DMipmaps(target, 4, imgWidth, + imgFormat, GL_UNSIGNED_BYTE, image); + } + else { + gluBuild2DMipmaps(target, 4, imgWidth, imgHeight, + imgFormat, GL_UNSIGNED_BYTE, image); + } - gluBuild2DMipmaps(GL_TEXTURE_2D, 4, imgWidth, imgHeight, - imgFormat, GL_UNSIGNED_BYTE, image); free(image); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter); + glTexParameteri(objTarget, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(objTarget, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(objTarget, GL_TEXTURE_MIN_FILTER, filter); + glTexParameteri(objTarget, GL_TEXTURE_MAG_FILTER, filter); } @@ -423,7 +447,11 @@ TypeFromName(const char *n) { "GL_INT_VEC2", GL_INT_VEC2 }, { "GL_INT_VEC3", GL_INT_VEC3 }, { "GL_INT_VEC4", GL_INT_VEC4 }, + { "GL_SAMPLER_1D", GL_SAMPLER_1D }, { "GL_SAMPLER_2D", GL_SAMPLER_2D }, + { "GL_SAMPLER_3D", GL_SAMPLER_3D }, + { "GL_SAMPLER_CUBE", GL_SAMPLER_CUBE }, + { "GL_SAMPLER_2D_RECT", GL_SAMPLER_2D_RECT_ARB }, { NULL, 0 } }; GLuint i; @@ -468,11 +496,40 @@ ReadConfigFile(const char *filename, struct config_file *conf) FragShaderFile[strlen(FragShaderFile) - 1] = 0; } else if (strncmp(line, "texture ", 8) == 0) { - char texFileName[100]; + char target[100], texFileName[100]; int unit, k; - k = sscanf(line + 8, "%d %s", &unit, texFileName); - assert(k == 2); - LoadTexture(unit, texFileName); + k = sscanf(line + 8, "%d %s %s", &unit, target, texFileName); + assert(k == 3 || k == 8); + if (strcmp(target, "CUBE") == 0) { + char texFileNames[6][100]; + k = sscanf(line + 8, "%d %s %s %s %s %s %s %s", + &unit, target, + texFileNames[0], + texFileNames[1], + texFileNames[2], + texFileNames[3], + texFileNames[4], + texFileNames[5]); + LoadTexture(unit, GL_TEXTURE_CUBE_MAP_POSITIVE_X, texFileNames[0]); + LoadTexture(unit, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, texFileNames[1]); + LoadTexture(unit, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, texFileNames[2]); + LoadTexture(unit, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, texFileNames[3]); + LoadTexture(unit, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, texFileNames[4]); + LoadTexture(unit, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, texFileNames[5]); + } + else if (!strcmp(target, "2D")) { + LoadTexture(unit, GL_TEXTURE_2D, texFileName); + } + else if (!strcmp(target, "3D")) { + LoadTexture(unit, GL_TEXTURE_3D, texFileName); + } + else if (!strcmp(target, "RECT")) { + LoadTexture(unit, GL_TEXTURE_RECTANGLE_ARB, texFileName); + } + else { + printf("Bad texture target: %s\n", target); + exit(1); + } } else if (strncmp(line, "uniform ", 8) == 0) { char name[1000], typeName[100]; @@ -509,7 +566,9 @@ ReadConfigFile(const char *filename, struct config_file *conf) static void Init(void) { + GLdouble vertTime, fragTime, linkTime; struct config_file config; + memset(&config, 0, sizeof(config)); if (ConfigFile) @@ -529,8 +588,16 @@ Init(void) exit(1); vertShader = CompileShaderFile(GL_VERTEX_SHADER, VertShaderFile); + vertTime = GetShaderCompileTime(); fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragShaderFile); + fragTime = GetShaderCompileTime(); + Program = LinkShaders(vertShader, fragShader); + linkTime = GetShaderLinkTime(); + + printf("Time to compile vertex shader: %fs\n", vertTime); + printf("Time to compile fragment shader: %fs\n", fragTime); + printf("Time to link shaders: %fs\n", linkTime); glUseProgram(Program); @@ -611,8 +678,8 @@ ParseOptions(int argc, char *argv[]) int main(int argc, char *argv[]) { - glutInit(&argc, argv); glutInitWindowSize(400, 400); + glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); win = glutCreateWindow(argv[0]); glewInit(); diff --git a/progs/util/shaderutil.c b/progs/util/shaderutil.c index 489e71cc30..c58c249831 100644 --- a/progs/util/shaderutil.c +++ b/progs/util/shaderutil.c @@ -14,6 +14,12 @@ #include <GL/glut.h> #include "shaderutil.h" +/** time to compile previous shader */ +static GLdouble CompileTime = 0.0; + +/** time to linke previous program */ +static GLdouble LinkTime = 0.0; + GLboolean ShadersSupported(void) @@ -37,10 +43,17 @@ CompileShaderText(GLenum shaderType, const char *text) { GLuint shader; GLint stat; + GLdouble t0, t1; shader = glCreateShader(shaderType); glShaderSource(shader, 1, (const GLchar **) &text, NULL); + + t0 = glutGet(GLUT_ELAPSED_TIME) * 0.001; glCompileShader(shader); + t1 = glutGet(GLUT_ELAPSED_TIME) * 0.001; + + CompileTime = t1 - t0; + glGetShaderiv(shader, GL_COMPILE_STATUS, &stat); if (!stat) { GLchar log[1000]; @@ -95,6 +108,7 @@ GLuint LinkShaders(GLuint vertShader, GLuint fragShader) { GLuint program = glCreateProgram(); + GLdouble t0, t1; assert(vertShader || fragShader); @@ -102,7 +116,12 @@ LinkShaders(GLuint vertShader, GLuint fragShader) glAttachShader(program, fragShader); if (vertShader) glAttachShader(program, vertShader); + + t0 = glutGet(GLUT_ELAPSED_TIME) * 0.001; glLinkProgram(program); + t1 = glutGet(GLUT_ELAPSED_TIME) * 0.001; + + LinkTime = t1 - t0; /* check link */ { @@ -121,6 +140,20 @@ LinkShaders(GLuint vertShader, GLuint fragShader) } +GLdouble +GetShaderCompileTime(void) +{ + return CompileTime; +} + + +GLdouble +GetShaderLinkTime(void) +{ + return LinkTime; +} + + void SetUniformValues(GLuint program, struct uniform_info uniforms[]) { diff --git a/progs/util/shaderutil.h b/progs/util/shaderutil.h index 0a6be02675..91c0d4094f 100644 --- a/progs/util/shaderutil.h +++ b/progs/util/shaderutil.h @@ -36,6 +36,12 @@ CompileShaderFile(GLenum shaderType, const char *filename); extern GLuint LinkShaders(GLuint vertShader, GLuint fragShader); +extern GLdouble +GetShaderCompileTime(void); + +extern GLdouble +GetShaderLinkTime(void); + extern void SetUniformValues(GLuint program, struct uniform_info uniforms[]); diff --git a/progs/xdemos/.gitignore b/progs/xdemos/.gitignore index 92446dd9fc..1b9b3a87c0 100644 --- a/progs/xdemos/.gitignore +++ b/progs/xdemos/.gitignore @@ -13,6 +13,7 @@ glxpixmap glxsnoop glxswapcontrol manywin +multictx offset overlay pbdemo |