Hi,

I tracked down a problem that caused the rpm and speed meters in Torcs
to be invisible if TCL was disabled. I think it boils down to a missing
radeonEmitState. It is possible that radeonEmitState is not called after
ValidateState has updated the state atoms and before the first primitive
with the new state is emitted. Adding a radeonEmitState at the end of
radeonValidateState fixes the problem but I'm not sure this is the right
place. It also fixes a flashing texture problem reported with Quake3 (on
Radeon VE or with TCL disabled) a long time ago. In many cases,
especially with TCL enabled there seem to be enough radeonEmitState and
RADEON_FIREVERTICES calls scattered throughout the driver to never cause
problems. Maybe some of them are no longer necessary if state is emitted
in radeonValidataState.

I attached a small commented example programme that demonstrates the
problem if TCL is disabled.

Regards,
Felix

               __\|/__    ___     ___     ___
__Tschüß_______\_6 6_/___/__ \___/__ \___/___\___You can do anything,___
_____Felix_______\Ä/\ \_____\ \_____\ \______U___just not everything____
  [EMAIL PROTECTED]    >o<__/   \___/   \___/        at the same time!
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>

#define PRIMITIVE GL_TRIANGLES
#define LAST_PRIMITIVE 1

unsigned char texData[2][8*8*3];
GLuint textures[2];

void init () {
    int i;
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glShadeModel (GL_FLAT);
    for (i = 0; i < 8*8; ++i) {
      /* red texture */
	texData[0][3*i+0] = rand();
	texData[0][3*i+1] = 0;
	texData[0][3*i+2] = 0;
      /* green texture */
	texData[1][3*i+0] = 0;
	texData[1][3*i+1] = rand();
	texData[1][3*i+2] = 0;
    }

    glGenTextures (2, textures);

  /* textures[0]: red */
    glBindTexture (GL_TEXTURE_2D, textures[0]);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, 8, 8, 0, GL_RGB, GL_UNSIGNED_BYTE, texData[0]);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

  /* texture[1]: green */
    glBindTexture (GL_TEXTURE_2D, textures[1]);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, 8, 8, 0, GL_RGB, GL_UNSIGNED_BYTE, texData[1]);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glEnable(GL_TEXTURE_2D);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    glBindTexture (GL_TEXTURE_2D, 0);
}

void display () {
    glClear (GL_COLOR_BUFFER_BIT);

    glEnable(GL_TEXTURE_2D);

  /* top left corner, texture[0] (red) */
    glBindTexture (GL_TEXTURE_2D, textures[0]);
    glBegin(GL_QUADS);
    glColor3f(1.0, 1.0, 0.0);
    glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, 0.0);
    glTexCoord2f(1.0, 0.0); glVertex2f(0.0, 0.0);
    glTexCoord2f(1.0, 1.0); glVertex2f(0.0, 1.0);
    glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, 1.0);
    glEnd();

  /* top right corner, texture[1] (green) */
    glBindTexture (GL_TEXTURE_2D, textures[1]);
    glBegin(PRIMITIVE);
    glColor3f(1.0, 1.0, 0.0);
#if (PRIMITIVE == GL_TRIANGLES)
    glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 0.0);
    glTexCoord2f(1.0, 0.0); glVertex2f(1.0, 0.0);
    glTexCoord2f(0.0, 1.0); glVertex2f(0.0, 1.0);

    glTexCoord2f(1.0, 0.0); glVertex2f(1.0, 0.0);
    glTexCoord2f(0.0, 1.0); glVertex2f(0.0, 1.0);
    glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
#elif (PRIMITIVE == GL_TRIANGLE_STRIP)
    glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 0.0);
    glTexCoord2f(1.0, 0.0); glVertex2f(1.0, 0.0);
    glTexCoord2f(0.0, 1.0); glVertex2f(0.0, 1.0);
    glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
#elif (PRIMITIVE == GL_TRIANGLE_FAN)
    glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 0.0);
    glTexCoord2f(1.0, 0.0); glVertex2f(1.0, 0.0);
    glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
    glTexCoord2f(0.0, 1.0); glVertex2f(0.0, 1.0);
#elif (PRIMITIVE == GL_QUADS)
    glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 0.0);
    glTexCoord2f(1.0, 0.0); glVertex2f(1.0, 0.0);
    glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
    glTexCoord2f(0.0, 1.0); glVertex2f(0.0, 1.0);
#elif (PRIMITIVE == GL_QUAD_STRIP)
    glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 0.0);
    glTexCoord2f(1.0, 0.0); glVertex2f(1.0, 0.0);
    glTexCoord2f(0.0, 1.0); glVertex2f(0.0, 1.0);
    glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
#elif (PRIMITIVE == GL_POLYGON)
    glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 0.0);
    glTexCoord2f(1.0, 0.0); glVertex2f(1.0, 0.0);
    glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
    glTexCoord2f(0.0, 1.0); glVertex2f(0.0, 1.0);
#endif
    glEnd();

  /* bottom left corner, no texture 
   * Conditions:
   * - TCL disabled
   * - primitive not QUADS or QUAD_STRIP
   * Trigger:
   * - glBegin-End pair (even if empty) after glDisable(GL_TEXTURE_2D)
   * Symptom:
   * previous primitive is rendered with textures[0] instead of textures[1]
   */
    glDisable(GL_TEXTURE_2D);
#if (LAST_PRIMITIVE)
    glBegin(GL_QUADS);
    glEnd();
#endif

    glutSwapBuffers();
}

void reshape (int w, int h) {
    glViewport (0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    glOrtho (-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
    glMatrixMode (GL_MODELVIEW);

}

int main (int argc, char *argv[]) {
    int winId;

    glutInit (&argc, argv);
    glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize (500, 500);
    glutInitWindowPosition (100, 100);
    winId = glutCreateWindow ("Texture Test");
    init ();
    glutDisplayFunc (display);
    glutReshapeFunc (reshape);
  //glutIdleFunc (display);

    glutMainLoop ();
    return 0;
}

Reply via email to