static enum piglit_result same_reg_written_twice(void *data) { bool pass = true; glBeginFragmentShaderATI(); glPassTexCoordATI(GL_REG_0_ATI, GL_TEXTURE0_ARB, GL_SWIZZLE_STR_ATI); pass &= piglit_check_gl_error(GL_NO_ERROR); glPassTexCoordATI(GL_REG_0_ATI, GL_TEXTURE1_ARB, GL_SWIZZLE_STR_ATI); pass &= piglit_check_gl_error(GL_INVALID_OPERATION); /* note: Mesa requires at least 1 arith instruction, * but this is not in the spec */ glColorFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_1_ATI, GL_NONE, GL_NONE); glEndFragmentShaderATI(); glBeginFragmentShaderATI(); glPassTexCoordATI(GL_REG_0_ATI, GL_TEXTURE0_ARB, GL_SWIZZLE_STR_ATI); pass &= piglit_check_gl_error(GL_NO_ERROR); glSampleMapATI(GL_REG_0_ATI, GL_TEXTURE1_ARB, GL_SWIZZLE_STR_ATI); pass &= piglit_check_gl_error(GL_INVALID_OPERATION); /* note: Mesa requires at least 1 arith instruction, * but this is not in the spec */ glColorFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_1_ATI, GL_NONE, GL_NONE); glEndFragmentShaderATI(); return pass ? PIGLIT_PASS : PIGLIT_FAIL; }
static enum piglit_result too_many_passes(void *data) { bool pass = true; glBeginFragmentShaderATI(); glColorFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_1_ATI, GL_NONE, GL_NONE); glPassTexCoordATI(GL_REG_0_ATI, GL_REG_0_ATI, GL_SWIZZLE_STR_ATI); glColorFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_1_ATI, GL_NONE, GL_NONE); pass &= piglit_check_gl_error(GL_NO_ERROR); glPassTexCoordATI(GL_REG_0_ATI, GL_REG_0_ATI, GL_SWIZZLE_STR_ATI); pass &= piglit_check_gl_error(GL_INVALID_OPERATION); glEndFragmentShaderATI(); glBeginFragmentShaderATI(); glColorFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_1_ATI, GL_NONE, GL_NONE); glPassTexCoordATI(GL_REG_0_ATI, GL_REG_0_ATI, GL_SWIZZLE_STR_ATI); glColorFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_1_ATI, GL_NONE, GL_NONE); pass &= piglit_check_gl_error(GL_NO_ERROR); glSampleMapATI(GL_REG_0_ATI, GL_TEXTURE0_ARB, GL_SWIZZLE_STR_ATI); pass &= piglit_check_gl_error(GL_INVALID_OPERATION); glEndFragmentShaderATI(); return pass ? PIGLIT_PASS : PIGLIT_FAIL; }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglPassTexCoordATI(JNIEnv *env, jclass clazz, jint dst, jint coord, jint swizzle, jlong function_pointer) { glPassTexCoordATIPROC glPassTexCoordATI = (glPassTexCoordATIPROC)((intptr_t)function_pointer); glPassTexCoordATI(dst, coord, swizzle); }
static void Init( int argc, char *argv[] ) { GLuint texObj[8]; GLint size, i; const char *exten = (const char *) glGetString(GL_EXTENSIONS); if (!strstr(exten, "GL_ATI_fragment_shader")) { printf("Sorry, GL_ATI_fragment_shader not supported by this renderer.\n"); exit(1); } glGetIntegerv(GL_MAX_TEXTURE_SIZE, &size); printf("%d x %d max texture size\n", size, size); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); for (i = 0; i < NumUnits; i++) { if (i < 6) TexEnabled[i] = GL_TRUE; else TexEnabled[i] = GL_FALSE; } /* allocate two texture objects */ glGenTextures(NumUnits, texObj); /* setup the texture objects */ for (i = 0; i < NumUnits; i++) { glActiveTextureARB(GL_TEXTURE0_ARB + i); glBindTexture(GL_TEXTURE_2D, texObj[i]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); if (i == 0) { if (!LoadRGBMipmaps(TEXTURE_1_FILE, GL_RGB)) { printf("Error: couldn't load texture image\n"); exit(1); } } else if (i == 1) { if (!LoadRGBMipmaps(TEXTURE_2_FILE, GL_RGB)) { printf("Error: couldn't load texture image\n"); exit(1); } } else { /* checker */ GLubyte image[8][8][3]; GLint i, j; for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { if ((i + j) & 1) { image[i][j][0] = 50; image[i][j][1] = 50; image[i][j][2] = 50; } else { image[i][j][0] = 25; image[i][j][1] = 25; image[i][j][2] = 25; } } } glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 8, 8, 0, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *) image); } /* Bind texObj[i] to ith texture unit */ /* if (i < 2) glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); else glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);*/ if (TexEnabled[i]) glEnable(GL_TEXTURE_2D); } boringshaderID = glGenFragmentShadersATI(1); boring2passID = glGenFragmentShadersATI(1); if (boring2passID == 0) { fprintf(stderr, "couldn't get frag shader id\n"); exit(1); } glBindFragmentShaderATI(boringshaderID); /* maybe not the most creative shader but at least I know how it should look like! */ glBeginFragmentShaderATI(); glSampleMapATI(GL_REG_0_ATI, GL_TEXTURE0_ARB, GL_SWIZZLE_STR_ATI); glSampleMapATI(GL_REG_1_ATI, GL_TEXTURE1_ARB, GL_SWIZZLE_STR_ATI); glSampleMapATI(GL_REG_2_ATI, GL_TEXTURE2_ARB, GL_SWIZZLE_STR_ATI); glSampleMapATI(GL_REG_3_ATI, GL_TEXTURE3_ARB, GL_SWIZZLE_STR_ATI); glSampleMapATI(GL_REG_4_ATI, GL_TEXTURE4_ARB, GL_SWIZZLE_STR_ATI); glSampleMapATI(GL_REG_5_ATI, GL_TEXTURE5_ARB, GL_SWIZZLE_STR_ATI); glColorFragmentOp2ATI(GL_MUL_ATI, GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_PRIMARY_COLOR, GL_NONE, GL_NONE); glAlphaFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_PRIMARY_COLOR, GL_NONE, GL_NONE); glColorFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_1_ATI, GL_NONE, GL_NONE, GL_REG_2_ATI, GL_NONE, GL_NONE); glColorFragmentOp2ATI(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_3_ATI, GL_NONE, GL_NONE); glColorFragmentOp2ATI(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_4_ATI, GL_NONE, GL_NONE); glColorFragmentOp2ATI(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_5_ATI, GL_NONE, GL_NONE); glEndFragmentShaderATI(); /* mathematically equivalent to first shader but using 2 passes together with some tex coord rerouting */ glBindFragmentShaderATI(boring2passID); glBeginFragmentShaderATI(); glPassTexCoordATI(GL_REG_1_ATI, GL_TEXTURE0_ARB, GL_SWIZZLE_STR_ATI); glSampleMapATI(GL_REG_2_ATI, GL_TEXTURE2_ARB, GL_SWIZZLE_STR_ATI); glSampleMapATI(GL_REG_3_ATI, GL_TEXTURE3_ARB, GL_SWIZZLE_STR_ATI); glSampleMapATI(GL_REG_4_ATI, GL_TEXTURE4_ARB, GL_SWIZZLE_STR_ATI); glSampleMapATI(GL_REG_5_ATI, GL_TEXTURE5_ARB, GL_SWIZZLE_STR_ATI); glColorFragmentOp2ATI(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI, GL_REG_2_ATI, GL_NONE, GL_NONE, GL_REG_3_ATI, GL_NONE, GL_NONE); glColorFragmentOp2ATI(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_4_ATI, GL_NONE, GL_NONE); glColorFragmentOp2ATI(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_5_ATI, GL_NONE, GL_NONE); /* not really a dependant read */ glSampleMapATI(GL_REG_0_ATI, GL_REG_1_ATI, GL_SWIZZLE_STR_ATI); glSampleMapATI(GL_REG_1_ATI, GL_TEXTURE1_ARB, GL_SWIZZLE_STR_ATI); glPassTexCoordATI(GL_REG_5_ATI, GL_REG_0_ATI, GL_SWIZZLE_STR_ATI); glColorFragmentOp2ATI(GL_MUL_ATI, GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_PRIMARY_COLOR, GL_NONE, GL_NONE); glAlphaFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_PRIMARY_COLOR, GL_NONE, GL_NONE); glColorFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_1_ATI, GL_NONE, GL_NONE, GL_REG_5_ATI, GL_NONE, GL_NONE); /* in principle we're finished here, but to test a bit more we do some fun with dot ops, replication et al. */ glSetFragmentShaderConstantATI(GL_CON_3_ATI, shaderconstant); glColorFragmentOp2ATI(GL_DOT4_ATI, GL_REG_3_ATI, GL_GREEN_BIT_ATI, GL_EIGHTH_BIT_ATI, GL_ZERO, GL_NONE, GL_COMP_BIT_ATI | GL_NEGATE_BIT_ATI, GL_CON_3_ATI, GL_RED, GL_2X_BIT_ATI); /* those args must get ignored, except dstReg */ glAlphaFragmentOp2ATI(GL_DOT4_ATI, GL_REG_4_ATI, GL_NONE, GL_ZERO, GL_NONE, GL_NONE, GL_ZERO, GL_NONE, GL_NONE); /* -> reg3 g = reg4 alpha = -0.5 */ glAlphaFragmentOp2ATI(GL_ADD_ATI, GL_REG_5_ATI, GL_NONE, GL_REG_3_ATI, GL_GREEN, GL_NONE, GL_REG_4_ATI, GL_NONE, GL_NONE); /* -> reg5 a = -1 */ glColorFragmentOp3ATI(GL_DOT2_ADD_ATI, GL_REG_4_ATI, GL_BLUE_BIT_ATI, GL_HALF_BIT_ATI, GL_REG_5_ATI, GL_ALPHA, GL_NEGATE_BIT_ATI, GL_ONE, GL_NONE, GL_BIAS_BIT_ATI, GL_ONE, GL_ALPHA, GL_2X_BIT_ATI | GL_NEGATE_BIT_ATI); /* -> reg 4 b = -0.5 */ glColorFragmentOp2ATI(GL_MUL_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_4_ATI, GL_BLUE, GL_NEGATE_BIT_ATI | GL_2X_BIT_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE); glEndFragmentShaderATI(); glBindFragmentShaderATI(boringshaderID); glEnable(GL_FRAGMENT_SHADER_ATI); glShadeModel(GL_FLAT); glClearColor(0.3, 0.3, 0.4, 1.0); if (argc > 1 && strcmp(argv[1], "-info")==0) { printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS)); } printf("output should be identical with both shaders to multiarb demo when 6 textures are enabled\n"); }