Exemplo n.º 1
0
/**
 * Generate a program that samples two textures into a pair of temporaries
 * over and over.
 *
 * This should excersize case (1) of question (24) of the ARB_fragment_program
 * spec without hitting case (2) at the same time.
 *
 * Note that the compiler could optimize out our inner TEX instructions
 * since they've got the same coordinates.  Assume the compiler isn't
 * for now.
 */
static char *gen_temporary_source_indirections(int sample_count,
					       GLuint *progname)
{
	char *prog;
	char *pre =
		"!!ARBfp1.0\n"
		"TEMP val, val2, sample, sample2;\n"
		"MOV val, fragment.color;\n"
		"MOV val2, fragment.color;\n";
	char *sample =
		"TEX sample, val, texture[0], 2D;\n"
		"TEX sample2, val2, texture[1], 2D;\n"
		"MUL val, sample, sample2;\n"
		"MUL val2, val2, val;\n";
	char *post =
		"MOV result.color, val;\n"
		"END";
	int i, instr_count;

	instr_count = 2 + 4 * (sample_count - 1) + 1;
	if (get_program_i(GL_MAX_PROGRAM_INSTRUCTIONS_ARB) < instr_count) {
		printf("indirection count %d too low to generate program with "
		       "%d indirections and %d instructions\n",
		       get_program_i(GL_MAX_PROGRAM_INSTRUCTIONS_ARB),
		       sample_count, instr_count);
		return NULL;
	}

	prog = malloc(strlen(pre) + strlen(sample) * (sample_count - 1) +
		      strlen(post) + 1);

	if (prog == 0) {
		printf("malloc failed.\n");
		piglit_report_result(PIGLIT_FAIL);
		exit(1);
	}

	sprintf(prog, "%s", pre);
	for (i = 0; i < sample_count - 1; i++)
		strcat(prog, sample);
	strcat(prog, post);

	*progname = piglit_compile_program(GL_FRAGMENT_PROGRAM_ARB, prog);
	glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, *progname);

	return prog;
}
Exemplo n.º 2
0
GLuint loadProgramARB(GLenum target, const GLubyte *code) {
    GLuint program_id ;
    glGenProgramsARB(1, &program_id) ;
    glBindProgramARB(target,program_id) ;
    glProgramStringARB(
        GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, (GLsizei)strlen((const char*)code), (const char*)code
    ) ;
    GLint errpos ;
    glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errpos) ;
    bool ok = ( errpos == -1) ;
    if(!ok) {
        const char* s = (const char*)(glGetString(GL_PROGRAM_ERROR_STRING_ARB)) ;
        std::cerr << "pixel_program_ARB error"
                  << ":" << errpos << ": " << s << std::endl ;
    }
    return program_id ;
}
Exemplo n.º 3
0
static void Init( void )
{
   static const char *modulate2D =
      "!!ARBfp1.0\n"
      "TEMP R0;\n"
      "TEX R0, fragment.texcoord[0], texture[0], 2D; \n"
      "MUL result.color, R0, fragment.color; \n"
      "END"
      ;
   GLuint modulateProg;
   GLuint Texture;

   if (!glutExtensionSupported("GL_ARB_fragment_program")) {
      printf("Error: GL_ARB_fragment_program not supported!\n");
      exit(1);
   }
   printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));

   /* Setup the fragment program */
   glGenProgramsARB(1, &modulateProg);
   glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, modulateProg);
   glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
                        strlen(modulate2D), (const GLubyte *)modulate2D);

   printf("glGetError = 0x%x\n", (int) glGetError());
   printf("glError(GL_PROGRAM_ERROR_STRING_ARB) = %s\n",
          (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
   assert(glIsProgramARB(modulateProg));

   glEnable(GL_FRAGMENT_PROGRAM_ARB);

   /* Load texture */
   glGenTextures(1, &Texture);
   glBindTexture(GL_TEXTURE_2D, Texture);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
   if (!LoadRGBMipmaps(TEXTURE_FILE, GL_RGB)) {
      printf("Error: couldn't load texture image file %s\n", TEXTURE_FILE);
      exit(1);
   }
   /* XXX this enable shouldn't really be needed!!! */
   glEnable(GL_TEXTURE_2D);

   glClearColor(.3, .3, .3, 0);
}
Exemplo n.º 4
0
GLuint compileASMShader(GLenum program_type, const char *code)
{
    GLuint program_id;
    glGenProgramsARB(1, &program_id);
    glBindProgramARB(program_type, program_id);
    glProgramStringARB(program_type, GL_PROGRAM_FORMAT_ASCII_ARB, (GLsizei) strlen(code), (GLubyte *) code);

    GLint error_pos;
    glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &error_pos);
    if (error_pos != -1) {
        const GLubyte *error_string;
        error_string = glGetString(GL_PROGRAM_ERROR_STRING_ARB);
        shrLog("Program error at position: %d\n%s\n", (int)error_pos, error_string);
        return 0;
    }
    return program_id;
}
static void Init( void )
{
   GLint errno;
   GLuint prognum;
   GLint i;

   static const char *prog1 =
      "!!ARBvp1.0\n"
      "MOV  result.color, {1.0}.xxxx;\n"
      "MOV  result.position, vertex.position;\n"
      "END\n";

   glGenProgramsARB(1, &prognum);
   glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prognum);
   glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
		      strlen(prog1), (const GLubyte *) prog1);

   assert(glIsProgramARB(prognum));
   errno = glGetError();
   printf("glGetError = %d\n", errno);
   if (errno != GL_NO_ERROR)
   {
      GLint errorpos;

      glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos);
      printf("errorpos: %d\n", errorpos);
      printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB));
   }


   glEnableClientState( GL_VERTEX_ARRAY );
   glEnableClientState( GL_COLOR_ARRAY );
   glVertexPointer( 3, GL_FLOAT, sizeof(verts[0]), verts );


   for (i = 0; i < NR_VERTS; i++) {
      verts[i][0] = cos(i / (float)NR_VERTS * 2.0 * 3.141592);
      verts[i][1] = sin(i / (float)NR_VERTS * 2.0 * 3.141592);
      verts[i][2] = 0.0;
      verts[i][3] = 1.0;

      indices[2*i+0] = i;
      indices[2*i+1] = (i+1 == NR_VERTS) ? 0 : i+1;
   }
}
Exemplo n.º 6
0
void tmu_isr(struct tmu_td *td)
{
    
    unsigned int hmesh_idx,vmesh_idx;
    int i;
    struct tmu_vertex * srcmesh;
    struct tmu_vertex * dstmesh;
    

    srcmesh = td->srcmesh;
    dstmesh = td->dstmesh;

    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, td->srchres, td->srcvres, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, td->srcfbuf);

//    glClear (GL_COLOR_BUFFER_BIT);                  /* Clear Screen */

    glMatrixMode (GL_MODELVIEW);            /* Select The Modelview Matrix */
    glLoadIdentity ();                              /* Reset The Modelview Matrix */

    glEnable(GL_BLEND);

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    if (td->chromakey != 0) {
        glEnable(GL_FRAGMENT_PROGRAM_ARB);
    
        glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, shader_num);
    }

    glBegin(GL_TRIANGLE_STRIP);

    for (hmesh_idx=0; hmesh_idx<=td->hmeshlast;hmesh_idx++)
    {
        for (vmesh_idx=0; vmesh_idx<=td->vmeshlast;vmesh_idx++)
        {
            glTexCoord2f((float) (srcmesh[index(hmesh_idx,vmesh_idx)].x)/1024.0 , (float) (srcmesh[index(hmesh_idx,vmesh_idx)].y)/512.0 );
//            printf("POUET %d %d : %d %d\n" , hmesh_idx, vmesh_idx ,dstmesh[index(hmesh_idx,vmesh_idx)].x , dstmesh[index(hmesh_idx,vmesh_idx)].y);
            glVertex2i( dstmesh[index(hmesh_idx,vmesh_idx)].x , dstmesh[index(hmesh_idx,vmesh_idx)].y);
        }
    }


    glEnd();
    glDisable(GL_FRAGMENT_PROGRAM_ARB);
}
Exemplo n.º 7
0
Shader::Shader(GLenum _target, const char *program, bool fromFile):id(0),target(_target)
{
  if (!program || !strlen(program)) {
    ok = true;
    return;
  }

  const char *progtext;
  if (fromFile) {
    char *buf;
    FILE *f = fopen(program, "rb");
    if (!f) {
      ok = false;
      return;
    }
    fseek(f, 0, SEEK_END);
    size_t len = ftell(f);
    fseek(f, 0, SEEK_SET);

    buf = new char[len+1];
    progtext = buf;
    fread(buf, len, 1, f);
    buf[len]=0;
    fclose(f);
    //gLog("Len: %d\nShader text:\n[%s]\n",len,progtext);
    if( buf )
    {
      delete[] buf;
      buf = NULL;
    }
  } else progtext = program;

  glGenProgramsARB(1, &id);
  glBindProgramARB(target, id);
  glProgramStringARB(target, GL_PROGRAM_FORMAT_ASCII_ARB, (GLsizei)strlen(progtext), progtext);
  if (glGetError() != 0) {
    int errpos;
    glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errpos);
    LogError << "Error loading shader: " << glGetString(GL_PROGRAM_ERROR_STRING_ARB) << std::endl;
    LogError << "Error position: " << errpos << std::endl;
    ok = false;
  } else ok = true;

}
Exemplo n.º 8
0
enum piglit_result
piglit_display(void)
{
	static const GLfloat color[4] = { 0.0, 0.5, 0.0, 0.5 };
	static const GLfloat good_color[4] = { 0.0, 1.0, 0.0, 1.0 };
	static const GLfloat bad_color[4] = { 1.0, 0.0, 0.0, 1.0 };
	enum piglit_result result = PIGLIT_PASS;
	unsigned i;

	glClear(GL_COLOR_BUFFER_BIT);

	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 0, bad_color);
	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 1, color);
	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 2, bad_color);
	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 3, bad_color);

	for (i = 0; i < ARRAY_SIZE(progs); i++) {
		const int x = 1 + (i * (BOX_SIZE + 1));

		glBindProgramARB(GL_VERTEX_PROGRAM_ARB, progs[i]);

		glVertexAttrib2fvARB(1, & attrib[i * 2]);

		piglit_draw_rect(x, 1, BOX_SIZE, BOX_SIZE);

		if (!piglit_probe_pixel_rgb(x + (BOX_SIZE / 2),
					    1 + (BOX_SIZE / 2),
					    good_color)) {
			if (! piglit_automatic)
				printf("shader %u failed with attributes "
				       "%.1f, %.1f\n",
				       i,
				       attrib[(i * 2) + 0],
				       attrib[(i * 2) + 1]);

			result = PIGLIT_FAIL;
		}
	}

	piglit_present_results();
	return result;
}
Exemplo n.º 9
0
void
piglit_init(int argc, char **argv)
{
	GLuint fs;
	GLuint vp;
	GLuint prog;
	GLenum err;

	if (piglit_get_gl_version() < 20) {
		printf("Requires OpenGL 2.0\n");
		piglit_report_result(PIGLIT_SKIP);
	}

	piglit_require_extension("GL_ARB_vertex_program");

	fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fs_text);
	prog = piglit_link_simple_program(fs, 0);
	glUseProgram(prog);

	glGenProgramsARB(1, &vp);
	glBindProgramARB(GL_VERTEX_PROGRAM_ARB, vp);
	glProgramStringARB(GL_VERTEX_PROGRAM_ARB,
                           GL_PROGRAM_FORMAT_ASCII_ARB,
                           strlen(vp_text),
                           (const GLubyte *) vp_text);

        err = glGetError();
        if (err != GL_INVALID_OPERATION) {
                printf("Unexpected OpenGL error state 0x%04x with bad "
		       "vertex program (expected 0x%04x).\n",
		       err, GL_INVALID_OPERATION);
		piglit_report_result(PIGLIT_FAIL);
        }

	glEnable(GL_VERTEX_PROGRAM_ARB);

	/* Clear all GL error state.
	 */
	while (glGetError() != 0)
		/* empty */ ;
}
Exemplo n.º 10
0
static void Init( void )
{
   GLint errnum;
   GLuint prognum;
   
   static const char *prog1 =
      "!!ARBvp1.0\n"
      "MOV  result.color, vertex.color;\n"
      "MOV  result.position, vertex.position;\n"
      "END\n";


   glGenProgramsARB(1, &prognum);

   glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prognum);
   glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
		      strlen(prog1), (const GLubyte *) prog1);

   assert(glIsProgramARB(prognum));
   errnum = glGetError();
   printf("glGetError = %d\n", errnum);
   if (errnum != GL_NO_ERROR)
   {
      GLint errorpos;

      glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos);
      printf("errorpos: %d\n", errorpos);
      printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB));
   }


   glEnableClientState( GL_VERTEX_ARRAY );
   glEnableClientState( GL_COLOR_ARRAY );

   glGenBuffersARB(1, &arrayObj);
   glBindBufferARB(GL_ARRAY_BUFFER_ARB, arrayObj);
   glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(verts), verts, GL_STATIC_DRAW_ARB);

   glVertexPointer( 4, GL_FLOAT, sizeof(verts[0]), 0 );
   glColorPointer( 4, GL_FLOAT, sizeof(verts[0]), (void *)(4*sizeof(float)) );
}
Exemplo n.º 11
0
void send_set_brush_vert_param(int i, int p, const float v[4])
{
    struct brush *b = get_brush(i);

    b->vert_param[p][0] = v[0];
    b->vert_param[p][1] = v[1];
    b->vert_param[p][2] = v[2];
    b->vert_param[p][3] = v[3];

    send_event(EVENT_SET_BRUSH_VERT_PARAM);
    send_index(i);
    send_index(p);
    send_array(b->vert_param[p], 4, sizeof (float));

    if (b->vert_prog && GL_has_vertex_program)
    {
        glBindProgramARB(GL_VERTEX_PROGRAM_ARB, b->vert_prog);
        glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB,
                                      p, b->vert_param[p]);
    }
}
Exemplo n.º 12
0
GLRenderWidgetImplementation::GLRenderWidgetImplementation(VideoWidget*videoWidget, const QGLFormat &format) :
        QGLWidget(format, videoWidget)
        , m_program(0)
        , m_yuvSupport(false)
        , m_videoWidget(videoWidget)
{
    makeCurrent();
    glGenTextures(3, m_texture);

    glProgramStringARB = (_glProgramStringARB) context()->getProcAddress(QLatin1String("glProgramStringARB"));
    glBindProgramARB = (_glBindProgramARB) context()->getProcAddress(QLatin1String("glBindProgramARB"));
    glDeleteProgramsARB = (_glDeleteProgramsARB) context()->getProcAddress(QLatin1String("glDeleteProgramsARB"));
    glGenProgramsARB = (_glGenProgramsARB) context()->getProcAddress(QLatin1String("glGenProgramsARB"));
    glActiveTexture = (_glActiveTexture) context()->getProcAddress(QLatin1String("glActiveTexture"));

    m_hasPrograms = glProgramStringARB && glBindProgramARB && glDeleteProgramsARB && glGenProgramsARB && glActiveTexture;

    if (m_hasPrograms) {
        glGenProgramsARB(1, &m_program);
        glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, m_program);

        const GLbyte *gl_src = reinterpret_cast<const GLbyte *>(yuvToRgb);
        glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
                           int(strlen(yuvToRgb)), gl_src);

        if (glGetError() != GL_NO_ERROR) {
            glDeleteProgramsARB(1, &m_program);
            m_hasPrograms = false;
        } else {
            m_yuvSupport = true;
        }
    }

    QPalette palette;
    palette.setColor(QPalette::Background, Qt::black);
    setPalette(palette);
    setAutoFillBackground(true);
    // Videowidget always have this property to allow hiding the mouse cursor
    setMouseTracking(true);
}
Exemplo n.º 13
0
enum piglit_result
piglit_display(void)
{
	static const GLfloat color[4] = { 0.0, 1.0, 0.0, 1.0 };
	static const GLfloat bad_color[4] = { 1.0, 0.0, 0.0, 1.0 };
	enum piglit_result result = PIGLIT_PASS;
	unsigned i;

	glClear(GL_COLOR_BUFFER_BIT);

	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 0, bad_color);
	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 1, color);
	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 2, color);
	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 3, color);

	for (i = 0; i < ARRAY_SIZE(progs); i++) {
		const int x = 1 + (i * (BOX_SIZE + 1));

		glBindProgramARB(GL_VERTEX_PROGRAM_ARB, progs[i]);
		glEnable(GL_CLIP_PLANE0 + i);
		piglit_draw_rect_tex(x, 1, BOX_SIZE, BOX_SIZE,
				     1.0, 1.0, -2.0, 0.0);
		glDisable(GL_CLIP_PLANE0 + i);

		if (!piglit_probe_pixel_rgb(x + (BOX_SIZE / 2) - 2,
					    1 + (BOX_SIZE / 2),
					    color)) {
			result = PIGLIT_FAIL;
		}

		if (!piglit_probe_pixel_rgb(x + (BOX_SIZE / 2) + 2,
					    1 + (BOX_SIZE / 2),
					    clear_color)) {
			result = PIGLIT_FAIL;
		}
	}

	piglit_present_results();
	return result;
}
Exemplo n.º 14
0
GPUProgram *GPU_program_shader_create(GPUProgramType type, const char *code)
{
	/* TODO(merwin): remove ARB program support (recode smoke shader in GLSL) */

	GPUProgram *program;
	GLint error_pos, is_native;

	if (!(GLEW_ARB_fragment_program && type == GPU_PROGRAM_TYPE_FRAGMENT))
		return NULL;

	program = MEM_callocN(sizeof(GPUProgram), "GPUProgram");

	switch (type) {
		case GPU_PROGRAM_TYPE_FRAGMENT:
			program->type = GL_FRAGMENT_PROGRAM_ARB;
			break;
	}

	/* create the object and set its code string */
	glGenProgramsARB(1, &program->prog);
	glBindProgramARB(program->type, program->prog);

	glProgramStringARB(program->type, GL_PROGRAM_FORMAT_ASCII_ARB, (GLsizei)strlen(code), code);

	glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &error_pos);
	glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &is_native);
	if ((error_pos == -1) && (is_native == 1)) {
		return program;
	}
	else {
		/* glGetError is set before that, clear it */
		while (glGetError() != GL_NO_ERROR)
			;
		shader_print_errors("compile", (const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB), &code, 1);
		MEM_freeN(program);
	}

	return NULL;
}
Exemplo n.º 15
0
enum piglit_result
piglit_display(void)
{
	static const GLfloat color[4] = { 0.0, 0.5, 0.0, 0.5 };
	static const GLfloat bad_color[4] = { 1.0, 0.0, 0.0, 1.0 };
	static const GLfloat good_color[4] = { 0.0, 1.0, 0.0, 1.0 };
	static const GLfloat attrib[4][4] = {
		{ 1.0, -37.0, 1.0, 68.2 },
		{ -37.0, 1.0, 68.2, 1.0 },
	};
	enum piglit_result result = PIGLIT_PASS;
	unsigned i;

	glClear(GL_COLOR_BUFFER_BIT);

	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 0, bad_color);
	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 1, bad_color);
	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 2, color);
	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 3, bad_color);

	for (i = 0; i < ARRAY_SIZE(progs); i++) {
		const int x = 1 + (i * (BOX_SIZE + 1));

		glBindProgramARB(GL_VERTEX_PROGRAM_ARB, progs[i]);

		glVertexAttrib4fvARB(1, attrib[i]);

		piglit_draw_rect(x, 1, BOX_SIZE, BOX_SIZE);

		if (!piglit_probe_pixel_rgb(x + (BOX_SIZE / 2),
					    1 + (BOX_SIZE / 2),
					    good_color)) {
			result = PIGLIT_FAIL;
		}
	}

	glutSwapBuffers();
	return result;
}
Exemplo n.º 16
0
enum piglit_result
piglit_display(void)
{
	enum piglit_result result = PIGLIT_PASS;

	const GLfloat expected[4] = { 0.5, 0.0, 0.0, 0.0 };

	glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, progs[0]);

	glClear(GL_COLOR_BUFFER_BIT);
	glEnable(GL_FRAGMENT_PROGRAM_ARB);

	piglit_draw_rect(0, 0, piglit_width, piglit_height);

	if (!piglit_probe_pixel_rgb(piglit_width / 2,
				    piglit_height / 2,
				    expected))
	  result = PIGLIT_FAIL;

	piglit_present_results();
	return result;
}
Exemplo n.º 17
0
/**
 * Check that the constant parameter \name is equal to \val.
 *
 * Since we also test for derived state involving floating point computation
 * don't test for strict equality but rather only check if the parameter's
 * components are within and epsilon of their expected values.
 */
static bool
check_prg_param_(const float *val, const char *name)
{
	char *vp_text;
	const float green[3] = {0.0, 1.0, 0.0};

	asprintf(&vp_text, vp_template, val[0], val[1], val[2], val[3], name);
	GLuint prog = piglit_compile_program(GL_VERTEX_PROGRAM_ARB, vp_text);
	free(vp_text);
	glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prog);

	glClear(GL_COLOR_BUFFER_BIT);
	piglit_draw_rect(-1, -1, 2, 2);

	glDeleteProgramsARB(1, &prog);

	if (piglit_probe_pixel_rgb_silent(piglit_width / 2, piglit_height / 2,
					  green, NULL))
		return true;
	printf("Failed parameter: '%s'.\n", name);
	return false;
}
Exemplo n.º 18
0
// 載入OpenGL ARB Fragment Program規格的組合語言
GLuint GutLoadFragmentProgramOpenGL_ASM(const char *filename)
{
	char filename_fullpath[256];
	sprintf(filename_fullpath, "%s%s", GutGetShaderPath(), filename);

	unsigned int size = 0;
	// 讀入檔案
	unsigned char *buffer = (unsigned char *) GutLoadBinaryStream(filename_fullpath, &size);
	if ( buffer==NULL )
	{
		return 0;
	}

	GLuint shader_id = 0;
	// 產生一個shader物件
	glGenProgramsARB(1, &shader_id);
	// 使用新的shader物件, 並把它設定成fragment program物件
    glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, shader_id );
	// 把組合語言指令載入shader物件中
	glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, size, buffer);
	// 如果Shader中出現了任何錯誤
	if ( GL_INVALID_OPERATION == glGetError() )
	{
		// Find the error position
		GLint errPos;
		glGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &errPos );
		// errors and warnings string.
		GLubyte *errString = (GLubyte *) glGetString(GL_PROGRAM_ERROR_STRING_ARB);
		fprintf( stderr, "error at position: %d\n%s\n", errPos, errString );
		// 讀取失敗, 釋放shader物件
		glDeleteProgramsARB(1, &shader_id);
		shader_id = 0;
	}
	// 把載入檔案的記憶體釋放
	GutReleaseBinaryStream(buffer);
	// shader_id代表新的shader物件
	return shader_id;
}
Exemplo n.º 19
0
GLuint GLProgramFactory::createARBProgram(const std::string& filename,
                                          GLenum type)
{
    // Get the file contents without NULL terminator
    CharBufPtr buffer = getFileAsBuffer(filename, false);

    // Bind the program data into OpenGL
    GlobalOpenGL().assertNoErrors();

    GLuint programID;
    glGenProgramsARB(1, &programID);
    glBindProgramARB(type, programID);

	glProgramStringARB(
        type,
        GL_PROGRAM_FORMAT_ASCII_ARB,
        GLsizei(buffer->size()),
        &buffer->front()
    );

    // Check for GL errors and throw exception if there is a problem
	if (GL_INVALID_OPERATION == glGetError())
    {
		GLint errPos;
		glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
		const GLubyte* errString = glGetString(GL_PROGRAM_ERROR_STRING_ARB);

        // Construct user-readable error string
        std::string error("GL program error: ");
        error += filename + "(" + string::to_string(errPos) + "): \n\n";
        error += std::string(reinterpret_cast<const char*>(errString));

        rConsoleError() << error << std::endl;
	}

    // Return the new program
    return programID;
}
Exemplo n.º 20
0
enum piglit_result
piglit_display(void)
{
	static const GLfloat color[4] = { 0.0, 1.0, 0.0, 1.0 };
	static const GLfloat bad_color[4] = { 1.0, 0.0, 0.0, 1.0 };
	enum piglit_result result = PIGLIT_PASS;
	unsigned i;

	glClear(GL_COLOR_BUFFER_BIT);

	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 0, bad_color);
	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 1, color);
	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 2, color);
	glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, 3, color);

	for (i = 0; i < ARRAY_SIZE(progs); i++) {
		const int x = 1 + (i * (BOX_SIZE + 1));

		glBindProgramARB(GL_VERTEX_PROGRAM_ARB, progs[i]);

		if (i == 0) {
			glVertexAttrib4fARB(1, 1.0, 0.0, 0.0, 0.0);
		} else {
			glVertexAttrib4fARB(1, 0.0, 1.0, 2.0, 3.0);
		}

		piglit_draw_rect(x, 1, BOX_SIZE, BOX_SIZE);

		if (!piglit_probe_pixel_rgb(x + (BOX_SIZE / 2),
					    1 + (BOX_SIZE / 2),
					    color)) {
			result = PIGLIT_FAIL;
		}
	}

	piglit_present_results();
	return result;
}
Exemplo n.º 21
0
static void Init(void)
{
   GLint errnum;
   GLuint prognum;
   static const char *prog1 =
      "!!ARBfp1.0\n"
      "TEMP R1;\n"
      "MOV  R1, state.material.emission;\n"
      "MUL  R1, R1, {0.9}.x;\n"
      "MOV  result.color, R1;\n"
      "END\n";


   fprintf(stderr, "GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
   fprintf(stderr, "GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
   fprintf(stderr, "GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
   fflush(stderr);

   /* Setup the fragment program */
   glGenProgramsARB(1, &prognum);
   glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prognum);
   glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
                      strlen(prog1), (const GLubyte *)prog1);
   
   errnum = glGetError();
   printf("glGetError = 0x%x\n", errnum);
   if (errnum != GL_NO_ERROR) {
      GLint errorpos;

      glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos);
      printf("errorpos: %d\n", errorpos);
      printf("glError(GL_PROGRAM_ERROR_STRING_ARB) = %s\n",
             (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
   }
   glEnable(GL_FRAGMENT_PROGRAM_ARB);

    glClearColor(0.0, 0.0, 1.0, 0.0);
}
Exemplo n.º 22
0
/**
 * Enable the shader.
 */
void GLShader::enable(void)
{
	switch (shaderType()) {
		case ST_GL_ARB_FRAGMENT_PROGRAM:
#ifdef ENABLE_ATI_TEXT_FRAGMENT_SHADER
		case ST_GL_ATI_TEXT_FRAGMENT_SHADER:
#endif /* ENABLE_ATI_TEXT_FRAGMENT_SHADER */
		{
			if (m_ARB_program == 0)
				break;

#ifdef ENABLE_ATI_TEXT_FRAGMENT_SHADER
			const GLenum prgType = (shaderType() == ST_GL_ARB_FRAGMENT_PROGRAM
						? GL_FRAGMENT_PROGRAM_ARB
						: GL_TEXT_FRAGMENT_SHADER_ATI
						);
#else /* !ENABLE_ATI_TEXT_FRAGMENT_SHADER */
			const GLenum prgType = GL_FRAGMENT_PROGRAM_ARB;
#endif /* ENABLE_ATI_TEXT_FRAGMENT_SHADER */

			// Enable the shader.
			glEnable(prgType);
			glBindProgramARB(prgType, m_ARB_program);
			break;
		}

		case ST_GL_ATI_FRAGMENT_SHADER:
			if (m_ATI_fragment_shader == 0)
				break;

			glEnable(GL_FRAGMENT_SHADER_ATI);
			glBindFragmentShaderATI(m_ATI_fragment_shader);
			break;

		default:
			break;
	}
}
Exemplo n.º 23
0
static void DoFrame(void)
{
	int i;

	glClearColor(0.3, 0.3, 0.3, 0.3);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glEnable(GL_FRAGMENT_PROGRAM_ARB);

	for(i = 0; i < NUM_PROGRAMS; ++i) {
		glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, FragProg[i]);

		glPushMatrix();
		glTranslatef(i/2, i%2, 0);
		glBegin(GL_QUADS);
			glVertex2f(0, 0);
			glVertex2f(1, 0);
			glVertex2f(1, 1);
			glVertex2f(0, 1);
		glEnd();
		glPopMatrix();
	}
}
Exemplo n.º 24
0
bool ATITShader::loadFragmentShaderFromFile(const char* fragPath)
{
   char fileNameBufferPix[512];
   Con::expandScriptFilename(fileNameBufferPix, sizeof(fileNameBufferPix), fragPath);
   
   const char* ps;
   
   Stream *p = ResourceManager->openStream(fileNameBufferPix);
   if(!p)
   {
      AssertWarn(false, avar("Failed to find ATIT fragment shader file: %s", fileNameBufferPix));
      return false;
   }
      
   mPixelSourceStringLength = ResourceManager->getSize(fileNameBufferPix);
   mPixelSourceString = (char *)dMalloc((mPixelSourceStringLength + 1) * sizeof(U8));
   p->read(mPixelSourceStringLength, mPixelSourceString);
   ResourceManager->closeStream(p);
   
   glEnable(GL_TEXT_FRAGMENT_SHADER_ATI);
   glGenProgramsARB(1, &mFragmentProgram);
   glBindProgramARB(GL_TEXT_FRAGMENT_SHADER_ATI, mFragmentProgram);
   glProgramStringARB(GL_TEXT_FRAGMENT_SHADER_ATI, GL_PROGRAM_FORMAT_ASCII_ARB, mPixelSourceStringLength, mPixelSourceString);
   
   #if defined(TORQUE_DEBUG) || defined(SHADER_MANAGER_DEBUG)
   const char* errorString = NULL;
   errorString = (const char*)glGetString(GL_PROGRAM_ERROR_STRING_ARB);
   Con::printf("Error string for %s is %s", fileNameBufferPix, errorString);
   if(errorString && errorString[0] != '\0')
      return false;
   #endif
   
   glDisable(GL_TEXT_FRAGMENT_SHADER_ATI);
   
   mFragFilepath = StringTable->insert(fileNameBufferPix);
   return true;
}
Exemplo n.º 25
0
static void DoFrame(void)
{
	int mask;

	glClearColor(0.0, 0.0, 0.0, 0.0);
	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

	glEnable(GL_FRAGMENT_PROGRAM_ARB);

	for(mask = 1; mask < 16; ++mask) {
		glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, FragProg[mask-1]);
		glPushMatrix();
		glTranslatef((mask % 4), (mask / 4), 0.0);

		glBegin(GL_QUADS);
			glVertex2f(0, 0);
			glVertex2f(1, 0);
			glVertex2f(1, 1);
			glVertex2f(0, 1);
		glEnd();

		glPopMatrix();
	}
}
Exemplo n.º 26
0
void GLRenderWidgetImplementation::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    m_drawFrameRect = m_videoWidget->calculateDrawFrameRect();
    if (m_yuvSupport && frameIsSet()) {
        glEnable(GL_FRAGMENT_PROGRAM_ARB);
        glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, m_program);
        const float tx_array[] = { 0, 0, 1, 0, 1, 1, 0, 1};
        const QRectF r = drawFrameRect();

        const float v_array[] = { float(r.left()), float(r.top()), float(r.right()), float(r.top()), float(r.right()), float(r.bottom()), float(r.left()), float(r.bottom()) };

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, m_texture[0]);
        glActiveTexture(GL_TEXTURE1);
        glBindTexture(GL_TEXTURE_2D, m_texture[1]);
        glActiveTexture(GL_TEXTURE2);
        glBindTexture(GL_TEXTURE_2D, m_texture[2]);
        glActiveTexture(GL_TEXTURE0);

        glVertexPointer(2, GL_FLOAT, 0, v_array);
        glTexCoordPointer(2, GL_FLOAT, 0, tx_array);
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glDrawArrays(GL_QUADS, 0, 4);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);

        glDisable(GL_FRAGMENT_PROGRAM_ARB);
    } else {
        painter.setRenderHint(QPainter::SmoothPixmapTransform);
        painter.drawImage(drawFrameRect(), currentFrame());
    }

    frameRendered();
}
Exemplo n.º 27
0
void PaletteRenderer::resetGLState(GLContextData& contextData) const
	{
	/* Get pointer to data item: */
	DataItem* dataItem=contextData.retrieveDataItem<DataItem>(this);
	
	if(dataItem->renderingPath==FragmentProgram)
		{
		glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB,0);
		glDisable(GL_FRAGMENT_PROGRAM_ARB);
		}
	else if(dataItem->renderingPath==TextureShader)
		glDisable(GL_TEXTURE_SHADER_NV);
	else
		{
		#ifdef __SGI_IRIX__
		glDisable(GL_TEXTURE_COLOR_TABLE_SGI);
		#endif
		if(sharePalette)
			glDisable(GL_SHARED_TEXTURE_PALETTE_EXT);
		}
	
	/* Call base class method: */ 
	VolumeRenderer::resetGLState(contextData);
	}
Exemplo n.º 28
0
int main(void)
{
   GLuint pid;
   ALLEGRO_DISPLAY *d;
   ALLEGRO_EVENT_QUEUE *queue;
   ALLEGRO_EVENT event;
   int frames = 0;
   double start;

   if (!al_init()) {
      abort_example("Could not init Allegro.\n");
      return 1;
   }

   al_set_new_display_flags(ALLEGRO_OPENGL);
   al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST);
   al_set_new_display_option(ALLEGRO_SAMPLES, 4, ALLEGRO_SUGGEST);
   d = al_create_display(WINDOW_W, WINDOW_H);
   if (!d) {
      abort_example("Unable to open a OpenGL display.\n");
      return -1;
   }

   if (al_get_display_option(ALLEGRO_SAMPLE_BUFFERS)) {
      printf("With multisampling, level %i\n", al_get_display_option(ALLEGRO_SAMPLES));
   }
   else {
      printf("Without multisampling.\n");
   }

   al_install_keyboard();

   queue = al_create_event_queue();
   al_register_event_source(queue, al_get_keyboard_event_source());
   al_register_event_source(queue, al_get_display_event_source(d));


   if (al_get_opengl_extension_list()->ALLEGRO_GL_ARB_multisample) {
      glEnable(GL_MULTISAMPLE_ARB);
   }

   if (!al_get_opengl_extension_list()->ALLEGRO_GL_ARB_vertex_program) {
      abort_example("This example requires a video card that supports "
                     " the ARB_vertex_program extension.\n");
      return -1;
   }

   glEnable(GL_DEPTH_TEST);
   glShadeModel(GL_SMOOTH);
   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
   glDisable(GL_CULL_FACE);

   /* Setup projection and modelview matrices */
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(45.0, WINDOW_W/(float)WINDOW_H, 0.1, 100.0);

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();

   /* Position the camera to look at our mesh from a distance */
   gluLookAt(0.0f, 20.0f, -45.0f, 0.0f, 0.0f, 0.0f, 0, 1, 0);

   create_mesh();

   /* Define the vertex program */
   glEnable(GL_VERTEX_PROGRAM_ARB);
   glGenProgramsARB(1, &pid);
   glBindProgramARB(GL_VERTEX_PROGRAM_ARB, pid);
   glGetError();

   if (al_get_opengl_extension_list()->ALLEGRO_GL_NV_vertex_program2_option) {
      glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
                        strlen(program_nv), program_nv);
   }
   else {
      glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
                        strlen(program), program);
   }

   /* Check for errors */
   if (glGetError()) {
      const char *pgm = al_get_opengl_extension_list()->ALLEGRO_GL_NV_vertex_program2_option
                        ? program_nv : program;
      GLint error_pos;
      const GLubyte *error_str = glGetString(GL_PROGRAM_ERROR_STRING_ARB);
      glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &error_pos);

      abort_example("Error compiling the vertex program:\n%s\n\nat "
            "character: %i\n%s\n", error_str, (int)error_pos,
            pgm + error_pos);
      return -1;
   }


   start = al_current_time();
   while (1) {
      if (!al_event_queue_is_empty(queue)) {
         while (al_get_next_event(queue, &event)) {
            switch (event.type) {
               case ALLEGRO_EVENT_DISPLAY_CLOSE:
                  goto done;

               case ALLEGRO_EVENT_KEY_DOWN:
                  if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE)
                     goto done;
                  break;
            }
         }
      }

      draw_mesh();
      al_flip_display();
      frames++;
   }

done:
   printf("%.1f FPS\n", frames / (al_current_time() - start));
   glDeleteProgramsARB(1, &pid);
   al_destroy_event_queue(queue);

   return 0;
}
Exemplo n.º 29
0
//////////////////////////////////////////////////////////////////////
//  renderQuad (sourced from FBO, assume the binding has already taken place)
//
//////////////////////////////////////////////////////////////////////
void CFrameBufferObject::renderQuad(int width, int height, GLenum eTarget)
{
#if 1
    float width_norm  = (float)width/(float)m_Width,
          height_norm = (float)height/(float)m_Height;

    // Bind the FBO texture for the display path
    glBindTexture(eTarget, m_fboData.colorTex);

    glGenerateMipmapEXT( GL_TEXTURE_2D );
    glBindTexture(eTarget, 0);

    // now render to the full screen using this texture
	glClearColor(0.2f, 0.2f, 0.2f, 0.0f);
	glClear(GL_COLOR_BUFFER_BIT);

	glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, m_textureProgram );
	glEnable(GL_FRAGMENT_PROGRAM_ARB);
	glDisable(GL_DEPTH_TEST);

	glBegin(GL_QUADS);
	{
		glVertex2f(0.0f      , 0.0f       ); glTexCoord2f(0.0f      , 0.0f       );
		glVertex2f(0.0f      , height_norm); glTexCoord2f(width_norm, 0.0f       );
		glVertex2f(width_norm, height_norm); glTexCoord2f(width_norm, height_norm);
		glVertex2f(width_norm, 0.0f       ); glTexCoord2f(0.0f      , height_norm);
	}
	glEnd();

    // Release the FBO texture (finished rendering)
    glBindTexture(eTarget, 0);

#else
    // Bind the FBO texture for the display path
    glBindTexture(eTarget, m_fboData.colorTex);

    // render a screen sized quad
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_LIGHTING);
    glEnable(eTarget);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);

    glMatrixMode( GL_MODELVIEW);
    glLoadIdentity();

    glViewport(0, 0, width, height);

    if (m_bUseFloat) {
       // fragment program is required to display floating point texture
       glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, m_textureProgram );
       glEnable(GL_FRAGMENT_PROGRAM_ARB);
       glDisable(GL_DEPTH_TEST);
    }

    glBegin(GL_QUADS);
    if (eTarget == GL_TEXTURE_2D) {
       glTexCoord2f(0.0f , 0.0f  ); glVertex3f(-1.0f, -1.0f, 0.5f);
       glTexCoord2f(1.0f , 0.0f  ); glVertex3f( 1.0f, -1.0f, 0.5f);
       glTexCoord2f(1.0f , 1.0f  ); glVertex3f( 1.0f,  1.0f, 0.5f);
       glTexCoord2f(0.0f , 1.0f  ); glVertex3f(-1.0f,  1.0f, 0.5f);
    } else {
       glTexCoord2f(0.0f , 0.0f  ); glVertex3f(-1.0f, -1.0f, 0.5f);
       glTexCoord2f(width, 0.0f  ); glVertex3f( 1.0f, -1.0f, 0.5f);
       glTexCoord2f(width, height); glVertex3f( 1.0f,  1.0f, 0.5f);
       glTexCoord2f(0.0f , height); glVertex3f(-1.0f,  1.0f, 0.5f);
    }

    glEnd();

    glMatrixMode(GL_PROJECTION);
    glPopMatrix();

    glDisable(eTarget);

    // Release the FBO texture (finished rendering)
    glBindTexture(eTarget, 0);
#endif
}
Exemplo n.º 30
0
// display results using OpenGL (called by GLUT)
void display()
{
    sdkStartTimer(&timer);

    // map PBO to get CUDA device pointer
    uchar4 *d_output;
    checkCudaErrors(cudaGraphicsMapResources(1, &cuda_pbo_resource, 0));
    size_t num_bytes;
    checkCudaErrors(cudaGraphicsResourceGetMappedPointer((void **)&d_output, &num_bytes,
                    cuda_pbo_resource));
    render(imageWidth, imageHeight, tx, ty, scale, cx, cy,
           blockSize, gridSize, g_FilterMode, d_output);

    checkCudaErrors(cudaGraphicsUnmapResources(1, &cuda_pbo_resource, 0));

    // Common display path
    {
        // display results
        glClear(GL_COLOR_BUFFER_BIT);

#if USE_BUFFER_TEX
        // display using buffer texture
        glBindTexture(GL_TEXTURE_BUFFER_EXT, bufferTex);
        glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, fprog);
        glEnable(GL_FRAGMENT_PROGRAM_ARB);
        glProgramLocalParameterI4iNV(GL_FRAGMENT_PROGRAM_ARB, 0, width, 0, 0, 0);
#else
        // download image from PBO to OpenGL texture
        glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo);
        glBindTexture(GL_TEXTURE_TYPE, displayTex);
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
        glTexSubImage2D(GL_TEXTURE_TYPE,
                        0, 0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, 0);
        glEnable(GL_TEXTURE_TYPE);
#endif

        // draw textured quad
        glDisable(GL_DEPTH_TEST);
        glBegin(GL_QUADS);
        glTexCoord2f(0.0f          , (GLfloat)height);
        glVertex2f(0.0f, 0.0f);
        glTexCoord2f((GLfloat)width, (GLfloat)height);
        glVertex2f(1.0f, 0.0f);
        glTexCoord2f((GLfloat)width, 0.0f);
        glVertex2f(1.0f, 1.0f);
        glTexCoord2f(0.0f          , 0.0f);
        glVertex2f(0.0f, 1.0f);
        glEnd();
        glDisable(GL_TEXTURE_TYPE);
        glDisable(GL_FRAGMENT_PROGRAM_ARB);

        glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);

        if (drawCurves)
        {
            // draw spline curves
            glPushMatrix();
            glScalef(0.25, 0.25, 1.0);

            glTranslatef(0.0, 2.0, 0.0);
            glColor3f(1.0, 0.0, 0.0);
            plotCurve(bspline_w3);

            glTranslatef(1.0, 0.0, 0.0);
            glColor3f(0.0, 1.0, 0.0);
            plotCurve(bspline_w2);

            glTranslatef(1.0, 0.0, 0.0);
            glColor3f(0.0, 0.0, 1.0);
            plotCurve(bspline_w1);

            glTranslatef(1.0, 0.0, 0.0);
            glColor3f(1.0, 0.0, 1.0);
            plotCurve(bspline_w0);

            glPopMatrix();
            glColor3f(1.0, 1.0, 1.0);
        }
    }

    glutSwapBuffers();
    glutReportErrors();

    sdkStopTimer(&timer);

    computeFPS();
}